

iPhone アプリを作成中です。

XML の要素値を、テーブルビューのセルのテキストとして使うにはどうすればいいのでしょうか。

具体的には以下の通りです

  * メソッド①で作成した `_iremono(NSString型)` の中身である XML の要素値を取得する
  * メソッド②の中で、取得した要素値をテーブルビューのテキストとして使いたい

[code]

    // ①要素値の発見時
    -(void)parser:(NSXMLParser *)parser
    foundCharacters:(NSString *)string {
    
    　　　// 要素名の判別
    　　　if ([_nowElem isEqualToString:@"item"]) {
    
    　　　　　// 解析中の要素名(直近)としてのインスタンス変数「_nowElem」の型は
    　　　　　//「NSMutableString」です。
    　　　　　NSLog(@"要素値：%@", string);
    
    　　　　　// 引数「string」の入れ物としてのインスタンス変数「_iremono」の型は
    　　　　　//「NSString*」です。
    　　　　　_iremono = string;
    
    　　　}
    }
    
    // ②設定（セル）
    - (UITableViewCell *)tableView:(UITableView *)tableView
             cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    　　　// セルオブジェクト設定
    　　　UITableViewCell *cell =
    　　　[tableView dequeueReusableCellWithIdentifier:@"Cell"
    　　　　　　　　　　　　　　　　　　forIndexPath:indexPath];
    
    
    　　　// 設定（セル）※この「@"Inherent Vice"」の代わりに①で取得した要素値を入れたい
    　　　cell.textLabel.text = @"Inherent Vice";
    　　　cell.textLabel.textColor = [UIColor blackColor];
    
    
    　　　return cell;
    }
    
[/code]

以上、どなたかご教示いただけないでしょうか。何卒よろしくお願いいたします。


CC BY-SA 3.0
2015-01-28T01:46:03.323
5473
2015-07-27T10:20:44.137
2015-01-28T03:23:04.597
4978
7470
question
objective-c ios8 tableview xml
XML の要素値を、テーブルビューのセルのテキストとして使うには


_iremonoにxmlをパースした値を設定するところまでできているのであれば、  
@"Inherent Vice"を_iremonoに変えるだけで良いのではないでしょうか？

[code]

    cell.textLabel.text = _iremono;
    
[/code]

もし、セル上に複数の要素を配置してあり、対象のラベルを取得できていないのであれば、  
下記方法で取得できると思います。

[code]

    // セルオブジェクト設定
    UITableViewCell *cell =
    [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    
    UILabel *label = (UILabel*)[cell viewWithTag:<対象ラベルのtag>];
    label.text = _iremono;
    
[/code]


CC BY-SA 3.0
2015-01-28T03:15:24.757
5480
2015-01-28T03:15:24.757
3516
5473
answer


XML、NSXMLParserとの関連を考える前に、UITableViewそのものに対する考察を、いまより深めるべきです。  
**UITableViewは、それ自身にデータを保持する機構がありません**
。たとえばUIImageViewならば、プロパティimageというものがあって、そこに自身の画像データを保持しています。ならば、UITableViewにも、プロパティdataのようなものがあって、自身のデータを保持していてもよさそうなものです。しかしそうなっていない。  
「 **MVCデザインパターン**
」という考え方があります。ウィキペディアにも載ってるくらい普及している、プログラム開発の指針ですが、かんたんに説明すると、データ（Model）と表示（View）は、分離してそれぞれのオブジェクトにすべきであるという指針です。そしてiOSはこのMVCに準拠して構成されています。データと表示のオブジェクトを仲介するオブジェクトをコントローラ（Controller）といいますが、UIKit中名前に「Controller」がつくクラスが多数見つかるのは、そういう理由です。  
UITableViewがデータを内部に保持しないのは、このMVCに準拠した結果です。であれば、あなたもMVCにしたがうのが、無理のないアプリ設計につながるでしょう。  
ビューオブジェクトはUITableView、コントローラはUIViewControllerあるいはUITableViewControllerとします。しぜんとそうなりますね。モデルオブジェクトは、いろいろなものをあてることができます。ひじょうにおおがかりで複雑なデータなら、CoreDataを使い、SQLiteなどのリレーショナルデータベースをモデルにすることになるでしょうし、データ保持のためのクラスを作成し、そのインスタンスを常駐させておく設計もできるでしょう。かんたんなものなら、NSMutableArrayのオブジェクトをモデルとするのが、手っ取り早いでしょう。  
ここではViewControllerのインスタンス変数として、NSMutableArrayのインスタンス「dataArray」を作って、これをモデルオブジェクトとします。

[code]

    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    　　　if ([_nowElem isEqualToString:@"item"]) {
              [dataArray addObject: string];
    　　　}
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    　　　UITableViewCell *cell =
    　　　[tableView dequeueReusableCellWithIdentifier:@"Cell"
    　　　　　　　　　　　　　　　　　　forIndexPath:indexPath];
    　　　cell.textLabel.text = dataArray[indexPath.row];
    　　　cell.textLabel.textColor = [UIColor blackColor];
    
    　　　return cell;
    }
    
[/code]

注：  
サンプルコード中、Objective-C 2.0の新しい書式、NSArrayの簡略書式を使っています。

[code]

    dataArray[indexPath.row];
    
[/code]

簡略していない書式：

[code]

    [dataArray objectAtIndex: indexPath.row];
    
[/code]


CC BY-SA 3.0
2015-01-28T06:12:08.817
5495
2015-01-28T06:12:08.817
7362
5473
answer