0

私は次の前提を持つ単純なアプリに取り組んでいます:

  • プラス ボタン付きの TableViewController - ユーザーが押すと、名前、タイトルなどを表すために入力するテキスト フィールドがモーダルに表示されます。保存を押すと、View Controller が消え、それらのエントリが Core Data データベースに追加され、エントリが表示されます。テーブルビューで。

サブタイトルなどの標準セルでこれをうまく機能させました。NSFetchedResultsController を使用しており、カスタム セルを展開したいと考えています。

スタイルをストーリーボードのカスタム セルに変更し、名前、タイトル、金額 (ユーザーが追加) を表す 3 つのラベルを追加しました。

UITableViewCell のカスタム クラスを作成し、このテーブル ビュー セルがそのカスタム参照クラスであることを確認しました。ラベルのプロパティを追加しました: nameLabel、amountLabel、titleLabel。

このクラスを完全な TableViewController クラスにインポートしました。オンラインのチュートリアルに従って、基本的に cellForRowAtIndexPath メソッドを次のように使用するだけであると述べています。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *cellIdentifier = @"TableCellID";

  TableCell *tablecell = (TableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];


  NSDictionary * dict = [self.tweetsArray objectAtIndex:indexPath.row];

  tablecell.title.text = [dict objectForKey:@"tweet"];

  UIImage *imageIcon = [UIImage imageNamed:[dict objectForKey:@"image"]];
  [tablecell.cellImage setImage:imageIcon];

  return tablecell;

}

それは私のコードではありませんが、 http://www.codigator.com/tutorials/ios-uitableview-tutorial-custom-cell-and-delegates/から参照されていますが、概念は同じです。

私は NSFetchedResultsController を使用しているため、実際にはセルに対して 2 つのメソッドがあります。

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    Transaction *transaction = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.nameLabel.text =[NSString stringWithFormat:@"%@", transaction.name];
    cell.amountLabel.text = [NSString stringWithFormat:@"%@", transaction.amount];
    cell.eventLabel.text = [NSString stringWithFormat:@"%@", transaction.title];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"People";

    TransactionCell *cell = (TransactionCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Set up the cell...
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

nameLabel、amountLabel が実際には認識されないため、このコードは機能しません。

(上のコードのように) すべての情報を cellForRowAtIndexPath に入れましたが、

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 

メソッドには次のエントリがあるためです。

case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

のメソッドシグネチャを変更しようとしました

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

することが:

- (void)configureCell:(TransactionCell *)cell atIndexPath:(NSIndexPath *)indexPath {

しかし、それは私には正しくないようで、警告があります。

基本的に、私は複雑なことを達成しようとはしていません。3 つのラベルを持つカスタム セルを作成しようとしているだけです。なぜ cellForRowAtIndexPath の「セル」が configureCell メソッドで認識されないのですか?

最後に、カスタム セルには特定のサイズがあり、通常より大きく、アプリの実行時には表示されません。それは正常なままです。セルのインスペクタでこれを行いましたが、テーブルビュークラスの最後に次のコードも追加しました:

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    tableView.rowHeight = 80;
}

しかし、それは通常の高さのままでした。

これに関するご支援をいただければ幸いです。

ありがとう、

4

2 に答える 2

1

これはおそらくあなたが電話するのを忘れたからです

self.tableView registerClass:forCellReuseIdentifier:

または

self.tableView registerNib:forCellReuseIdentifier:

あなたのviewDidLoad(self.tableViewがあなたのUITableViewを指していると仮定して)

ところで、両方を実装しないでください! セル用に xib を作成した場合は、registerNib単独で使用してください。UITableViewCell サブクラスを作成した場合は、registerClass単独で使用してください。

于 2013-11-12T08:28:49.777 に答える
1

次の 2 つのオプションがあります。

  • の署名をconfigureCellに変更

    - (void)configureCell:(TransactionCell *)cell atIndexPath:(NSIndexPath *)indexPath
    

    追加のキャストを追加します

    case NSFetchedResultsChangeUpdate:
        [self configureCell:(TransactionCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;
    
  • または、署名をconfigureCellそのままにして、メソッド内でキャストします。

    - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
        TransactionCell *tcell = (TransactionCell *)cell;
        Transaction *transaction = [self.fetchedResultsController objectAtIndexPath:indexPath];
        tcell.nameLabel.text = transaction.name;
        tcell.amountLabel.text = transaction.amount;
        tcell.eventLabel.text = transaction.title;
    }
    

    stringWithFormat:(すべての呼び出しは不要であることに注意してください。)

私は 2 番目の方法を使用しますが、それは好みの問題です。

于 2013-11-12T08:15:17.270 に答える