7

UITableViewController/UITableView と Core Data を使用する iPhone アプリを実装しました。さらに、NSFetchedResultsController を使用してテーブル データを管理します。これはすべて非常に簡単で、うまく機能します。次に、行が見つからない/取得されない場合に UITableView にメッセージを表示する必要があると判断しました。これを調査した後、これを行う最善の方法 (おそらく唯一の方法) は、メッセージを含む「ダミー」セルを返すことであることがわかりました。ただし、これを行うと、データの不整合について不平を言うランタイム システムから、「無効な更新: セクションの数が無効です。テーブル ビューに含まれるセクションの数 ...」という厄介なメッセージが表示されます。関連するコードは次のとおりです。

- (NSInteger) numberOfSectionsInTableView: (UITableView *)tableView
{
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) return 1;
    return [[self.fetchedResultsController sections] count];
}

- (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) return 1;
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex: section];
    return [sectionInfo numberOfObjects];
}

- (UITableViewCell *) tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) {
        UITableViewCell *cell = [[UITableViewCell alloc] init];
        cell.textLabel.text = @"No widgets found.";
        return cell;
    }

    STCellView *cell = (STCellView *)[tableView dequeueReusableCellWithIdentifier: @"ShieldCell"];
    [self configureCell: cell atIndexPath: indexPath];
    return cell;
}

同様の質問からの回答を読みましたが、使用する必要があるようです

insertRowsAtIndexPaths: withRowAnimation:

「ダミー」メッセージ行をテーブルに挿入します。ただし、これは、実際の行が挿入されたときに「ダミー」行を削除することも意味します。私はこれを行うことができますが、これを達成するためのより簡単な方法があるはずです。私がやりたいことは、テーブルに行がないことを示すメッセージを表示することだけです (簡単ですか?)。したがって、私の質問は次のとおりです。「ダミー」セルアプローチを使用せずに UITableView にメッセージを表示する方法はありますか、または UITableViewController/NSFetchResulsController にこれが「ダミー」行にすぎず、取得してはならないことを納得させる方法はありますかテーブルの実際の行ではないので(私の観点から)、それについてとても怒っていますか?

あなたが提供できる助けは非常に高く評価されます (私は iPhone 開発に苦労している初心者であり、ベストプラクティスを学びたいと思っています)。ありがとう。

4

4 に答える 4

13

tableview データソースをハックして目的の UI を取得するのではなく、「行が見つかりません」というメッセージを tableview ヘッダーに追加する必要があります。

于 2012-09-03T22:46:20.060 に答える
2

私が以前に使用した別のアプローチは、データ更新を処理するモデル クラスで行が検出されなかったセクションに「行なし」エンティティを挿入することにより、Core Data を使用して更新を管理することです。

これを実装するにはいくつかの方法があります。たとえば、名前/タイトル フィールドをエンティティ内の既知のステータス メッセージまたはフラグに設定します。挿入すると、cellForRowAtIndexPath デリゲート メソッドで「行なし」エンティティを検出し、代替テーブル セルを挿入してメッセージを表示できます。

そのセクションのデータを更新する前に、「行なし」エンティティを削除するだけです。

于 2012-09-02T10:28:56.030 に答える
1

空のメッセージを表示するための私の簡単な提案は、コントローラーを単純なUIViewController(ではなくUITableViewController) に再配置することです。

これUIViewControllerは、UITableView(コントローラーはデータ ソースであり、テーブルのデリゲートです) と、空の行メッセージを表示するUILabel(またはUIViewを含む) によって構成されます。UILabel

このようにして、取得した行に基づいてテーブルとラベルの可視性を制御できます。

NSFetchResultsControllerこのアプローチは面倒かもしれませんが、ハッキングやデータ ソースを回避するのは良いことだと思います。さらに、空のメッセージの配置を完全に制御できます。

@Rog が示唆したように、テーブル ビュー ヘッダーを使用してそのメッセージを表示することもできます。あなたが好むように。

それが役に立てば幸い。

于 2012-09-02T10:10:05.410 に答える