3

グループ化されたテーブルビューで動的セルと静的セルを混在させようとしています。上部に静的セルがあり、その後に動的セルのセクションが続く2つのセクションを取得したいと思います(下のスクリーンショットを参照してください)。テーブルビューの内容を静的セルに設定しました。

動的テーブルビューセルと静的テーブルビューセルの混合

編集

AppleFreakのアドバイスに基づいて、コードを次のように変更しました。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell;
    if (indexPath.section <= 1) { // section <= 1 indicates static cells
        cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 
    } else { // section > 1 indicates dynamic cells
        CellIdentifier = [NSString stringWithFormat:@"section%idynamic",indexPath.section];
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    }
return cell;

}

しかし、私のアプリはエラーメッセージでクラッシュします

キャッチされなかった例外'NSInternalInconsistencyException'が原因でアプリを終了しています、理由:' UITableView dataSourceはtableView:cellForRowAtIndexPathからセルを返す必要があります:'

セクション0と行0の場合。セクション0と行0の場合に返されるセルcell = [super tableView:tableView cellForRowAtIndexPath:indexPath]はですnil

私のコードの何が問題になっていますか?アウトレットに問題はありますか?私はサブクラス化UITableViewControllerしており、テーブルビューを設定するためのアウトレットがないと思われるため、アウトレットを設定していません(?)。それをより良くする方法について何か提案はありますか?

ここに画像の説明を入力してください

編集II

ストーリーボードでシーンを再作成し(上記の更新されたスクリーンショットを参照してください)、新しいベースから開始するためにビューコントローラーを書き直しました。また、applefreakが提案したように、Appleのフォーラムの説明も読みました。ただし、numberOfSectionsInTableView:tableView静的セクションの数(2)を1つ増やす方法で、最初の問題を実行します。

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [super numberOfSectionsInTableView:tableView] + 1 ; }

アプリがクラッシュし、次のエラーメッセージが表示されました。

キャッチされなかった例外'NSRangeException'が原因でアプリを終了しています。理由:'***-[__ NSArrayI objectAtIndex:]:インデックス2が境界を超えています[0 .. 1] '

Appleとapplefreakの推奨事項に従っているのに、このコードが機能しないのはなぜですか?iOS 6でtableViewが少し変更された可能性はありますか?

解決策:以下の彼の回答にあるAppleFreaksコードサンプルを使用して、これを機能させることができました。ありがとう、AppleFreak!

編集III:セルの選択:

混合(動的セルと静的セル)セルテーブルビューでセル選択を処理するにはどうすればよいですか?いつ電話superし、いつ電話しself tableViewますか?使うとき

[[super tableView] selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]

選択したインデックスパスを次のように確認してください。

UITableView *tableView = [super tableView];
if ( [[tableView indexPathForSelectedRow] isEqual:customGrowthIndexPath] ) { .. }

の戻り値を取得しますnil

エラーの原因がわからないので、よろしくお願いします。

4

6 に答える 6

13

静的セルの場合、スーパー メソッドを呼び出す必要があります。UITableViewController を拡張すると思います。下記参照

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell;

    /* Detect cell is static or dynamic(prototype) based on the index path and your settings */

    if ("Cell is prototype") 
       cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
   else if ("Cell is static")
       cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];

  // Modify cell properties if you want

   return cell;
}

また、セルの混合の詳細については、Apple フォーラムの「 Mixing static and dynamic table view content」ディスカッションを参照してください。

[編集]

上記のアップルのリンクをまだ読んでいない場合は、注意深く読んでください。動的コンテンツの場合、コード自体で指定された識別子を使用して、最初にセルを構築します。次回病棟では、セルを構築するのではなく、セルをデキューします! それは同じ古い方法です。

さらに、静的データ ソースは (たとえば) セクションが 2 つしかないと考えていることに注意してください。セクション 2 について尋ねることはできません。なぜなら、セクション 0 と 1 しかないと考えているからです。テーブルの最後以外の場所に動的コンテンツを挿入する場合は、データを転送するときにスーパーに嘘をつく必要があります。ソースメソッド。たとえば、numberOfRowsInSection: メソッドは次のようになります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 1) {
        return 1;
    }
    else if (section > 1){
        section--; // Basically you are forming sections for dynamic content
    }

    return [super tableView:tableView numberOfRowsInSection:section];
}

重要なのは、動的コンテンツを調整して、静的データ ソースが期待どおりの値を取得できるようにすることです。

[編集]

これが完全な動作例であり、テストされています。コード内の次のメソッドをすべてコピーするだけで、すぐに機能するはずです。セルが混在している場合は、すべてのテーブルビュー メソッドをオーバーライドする必要があります。要件に従って「numberOfSectionsInTableView」で静的および動的セクションの総数を返し、次に残りの各メソッドで返します。問題のセクションまたは行が静的である場合は、super を呼び出すだけです。動的である場合は、通常の UITableViewController サブクラスの場合と同様に、関連する詳細を返します。この例では、単純に nil またはハードコードされた値を返しています。

詳細については、Apple フォーラムのこのスレッドを確認してください。

- (int)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 3;
}

- (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return nil;
}

- (NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
    return nil;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

-(float)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 44.0f;
}

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 44.0f;
}

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44.0f;
}

- (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    return nil;
}

-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return nil;
}

-(int)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 5;
}

- (int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(section == 0)
        return 2;
    if(section == 1)
        return 2;

    return 5;
}

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.section <= 1)
        return [super tableView:tableView cellForRowAtIndexPath:indexPath];

    static NSString *CellIdentifier = @"Cell";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];


    cell.textLabel.text = @"dynamic row";

    return cell;
}

[編集]

didSelectRowAtIndexPath で super を呼び出さないでください。それは簡単です。以下のコードを参照してください。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     int row = indexPath.row;
     [tableView deselectRowAtIndexPath:indexPath animated:YES];

     UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
     //process the cell
}
于 2012-10-12T12:33:06.853 に答える
1

静的セルでカスタム動的セルを使用する最も簡単な方法:

1) コンテナー ビューを動的 TableView のヘッダーに配置する 2) 静的 TableView をこのコンテナーに割り当て、[スクロールを有効にする] のチェックを外す

于 2014-02-04T05:33:10.750 に答える
0
UITableViewCell *cell = [self dequeueReusableCellWithIdentifier:@"cellIdentify"];
if (cell == nil)
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellIdentify"];

allocを呼び出さないだけです。再利用したくない場合は、dequeueReusableCellWithIdentifier を呼び出さないでください。

于 2012-10-12T15:35:44.683 に答える
0

デキューするセルがない場合、セルは nil になるため、新しいセルを割り当て/初期化する必要があります。セルをデキューしようとした後でセルの値を確認し、値がゼロの場合は新しいセルを作成してください。

于 2012-10-12T11:51:28.317 に答える