【Objective-C】plistの内容をTableに表示させる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りょち
記事: 7
登録日時: 10年前

【Objective-C】plistの内容をTableに表示させる

#1

投稿記事 by りょち » 10年前

先日はありがとうございました。お陰様で順調に進んでおります。

が、ちょっと行き詰まりましたので御教授願いたいです。

とあるviewからplistをセーブデータとして保存して、別のViewに表示させようとしています。(Result表示)
保存先のplistには追記する形で保存しており、以下のような形式になっています。
<dict>
<key>data1</key>
<array>
<string>str1</string>
<string>str2</string>
<string>str3</string>
<key>data2</key>
<array>
<string>str1</string>
<string>str2</string>
<string>str3</string>
・・以下<key>から追記

と保存する度に追記していきます。それをTableViewでグループ化表示を行うようにしたのですが、
最初からあるkeyの数だけのグループ化はできるのですが、追記分が反映されません。
元ファイルのplistにはちゃんと追加されているので、アプリを再起動すると追加した分のkeyも出てくるようになります。

最初はViewDidLoadで指定していたのでアプリの初回起動だけしか反映されないのは気がついたのですが
viewが切り替わる度に読み込むメソッドに入れても結果は同じでした。

以下がコードになります。

コード:

(void)viewWillAppear:(BOOL)animated
{
	NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *plistPath = [[docPaths objectAtIndex:0] stringByAppendingPathComponent:@"save.plist"];
	NSDictionary *dict = [[NSDictionary alloc]initWithContentsOfFile:plistPath];
	self.names = dict;
	NSLog(@"%@",dict);
	[dict release];
	NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
	self.keys = array;
	NSLog(@"%@",array);
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
	return [keys count];
}

-(NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section{
	NSString *key = [keys objectAtIndex:section];
	NSArray *nameSection = [names objectForKey:key];
	return [nameSection count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView
		cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	NSUInteger section = [indexPath section];
	NSUInteger row = [indexPath row];
	NSString *key = [keys objectAtIndex:section];
	NSArray *nameSection = [names objectForKey:key];
	static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier";
	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
							 SectionsTableIdentifier ];
	if (cell == nil){
		cell = [[[UITableViewCell alloc]initWithFrame:CGRectZero
									  reuseIdentifier: SectionsTableIdentifier ] autorelease];
	}
	cell.textLabel.text = [nameSection objectAtIndex:row];
	return cell;
}

-(NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section
{
	NSString *key = [keys objectAtIndex:section];
	return key;
}
お手数おかけしますがアドバイスお願い申し上げます。

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: 【Objective-C】plistの内容をTableに表示させる

#2

投稿記事 by Justy » 10年前

りょち さんが書きました:保存する度に追記していきます。それをTableViewでグループ化表示を行うようにしたのですが、
最初からあるkeyの数だけのグループ化はできるのですが、追記分が反映されません。
 んー、UITableViewクラスの reloadDataメソッドを呼び出してみてはどうでしょう?

りょち
記事: 7
登録日時: 10年前

Re: 【Objective-C】plistの内容をTableに表示させる

#3

投稿記事 by りょち » 10年前

Justy さんが書きました:んー、UITableViewクラスの reloadDataメソッドを呼び出してみてはどうでしょう?
返信ありがとうございます。reloadDataメソッドを調べてみると
[self.tableView reLoadData]
で実装されてるコードが幾つかありましたが
自分のコードに当て込むと
request for member 'tableView' in something not a structure or union
とエラーが出ます。
何かが足りないのでしょうか?ご指摘お願いいたします。

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: 【Objective-C】plistの内容をTableに表示させる

#4

投稿記事 by Justy » 10年前

りょち さんが書きました:request for member 'tableView' in something not a structure or union
とエラーが出ます。
 self.tableViewUITableVIewであるというなら、そのクラスは UITableViewContorlerクラスを
継承しているか、プロパティに tableViewが無ければなりません。

 多分その条件を満たしていないのでしょう。

りょち
記事: 7
登録日時: 10年前

Re: 【Objective-C】plistの内容をTableに表示させる

#5

投稿記事 by りょち » 10年前

Justy さんが書きました:self.tableViewUITableVIewであるというなら、そのクラスは UITableViewContorlerクラスを
継承しているか、プロパティに tableViewが無ければなりません。

 多分その条件を満たしていないのでしょう。
ご指摘のとおりでございました。
h.ファイルに
IBOutlet UITableView *table;
@property (nonatomic, retain) UITableView *table;
を追加して、.mファイルで@synthesizeすれば大丈夫でした。お恥ずかしい。

コード:

-(void)viewWillAppear:(BOOL)animated
{
	NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *plistPath = [[docPaths objectAtIndex:0] stringByAppendingPathComponent:@"save.plist"];
	NSDictionary *dict = [[NSDictionary alloc]initWithContentsOfFile:plistPath];
	self.names = dict;
	[dict release];
	NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
	self.keys = array;
	[self.table reloadData];
	[super viewDidLoad];
}
のようにしてみましたがやはりviewのリロードは行われませんでした。
[self.table reloadData];の場所を変えてみたりしたんですが、状況は変わりませんでした。
まだどこかに問題はありそうでしょうか?

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: 【Objective-C】plistの内容をTableに表示させる

#6

投稿記事 by Justy » 10年前

 TableViewのデータソースとデリゲートは正しく設定されていますか?
 (それ以前に何で viewWillAppearで [super viewDidLoad]を呼び出しているんですか??)

 それでもうまくいかないようでしたら、断片コードだけでは解決は難しいかと思うので
再現できるビルド可能なプロジェクト・コードを提示してもらえれば何かわかるかもしれません。

りょち
記事: 7
登録日時: 10年前

Re: 【Objective-C】plistの内容をTableに表示させる

#7

投稿記事 by りょち » 10年前

Justy さんが書きました: TableViewのデータソースとデリゲートは正しく設定されていますか?
 (それ以前に何で viewWillAppearで [super viewDidLoad]を呼び出しているんですか??)

 それでもうまくいかないようでしたら、断片コードだけでは解決は難しいかと思うので
再現できるビルド可能なプロジェクト・コードを提示してもらえれば何かわかるかもしれません。
データソースとデリゲートは正しく設定できると思います。出来てないとデータ読み込んでくれないと思いますので・・・。
[super viewDidLoad]はviewWillApperとdidLoadを何度も切り替えているときに消し忘れただけです。すみません。

プロジェクトファイルを添付いたします。
saveでplistファイルが保存されて、現在時刻をkeyとして、data1~data4の内容がarrayとして保存されます。
保存されたplistの内容が即時に反映するという機能が一つ。
deleteでplistファイルを消すことが出来て、Resultで何も見えなくしたいという機能が1つになります。

お手数おかけしますが御教授お願い申し上げます。
添付ファイル
plistSaveTest.zip
(27.39 KiB) ダウンロード数: 58 回

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: 【Objective-C】plistの内容をTableに表示させる

#8

投稿記事 by Justy » 10年前

りょち さんが書きました:
Justy さんが書きました:データソースとデリゲートは正しく設定できると思います。
 確かに。データソースとデリゲートは正しく設定されていることは確認出来ました。

 しかし。
 肝心の IBOutlet指定されている tableViewが IB上の "Table View"と繋がっていないため、
nilになっています。
 その為、reloadDataメソッドが実行されていないようです。

 resultViewController.xibの File's Ownerの Outletsで見ると tableViewが空欄になっていますので、
ここを "Table View"と繋げてみて下さい。

りょち
記事: 7
登録日時: 10年前

Re: 【Objective-C】plistの内容をTableに表示させる

#9

投稿記事 by りょち » 10年前

Justy さんが書きました: 確かに。データソースとデリゲートは正しく設定されていることは確認出来ました。

 しかし。
 肝心の IBOutlet指定されている tableViewが IB上の "Table View"と繋がっていないため、
nilになっています。
 その為、reloadDataメソッドが実行されていないようです。

 resultViewController.xibの File's Ownerの Outletsで見ると tableViewが空欄になっていますので、
ここを "Table View"と繋げてみて下さい。
ご指摘の通り、TableViewと接続することで解決いたしました。
Justy様、いつもいつもありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る