1

紳士、

ここで助けが必要です。自分が何をしようとしているのかはわかっているようですが、コーディング時に機能させることができませんでした。シナリオは、テーブルビューを含むビューコントローラがあることです。3種類のセルがあるため、テーブルビューには3つの異なる動的プロトタイプがあります。ここで、私がやりたいのは、どのプロトタイプセルをどの行に生成するかを指定することだけです。また、ストーリーボードで各プロトタイプセルに一意の識別子を付けました。

私が理解する方法は、cellforRowatIndexpathメソッドがその行に表示するセルの種類を理解し、そのような識別子を選択し、必要に応じてコンテンツをデキューして設定する必要があるということです。

それに対応して、これは私がやろうとしている私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath   * )indexPath
{
    if(indexPath.row==0)
    {
        static NSString *CellIdentifier = @"HelloCell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault      reuseIdentifier:CellIdentifier];
        }

        // configure your cell here...

        return cell;
    }
}

残念ながら、物事は計画どおりに機能せず、アプリがクラッシュして2013-02-07 16:47:39.859 ProjectsABC30068:c07] *キャッチされない例外'NSInvalidArgumentException'、理由:'-[NSIndexPath setTableViewStyle:]が原因でアプリが終了します:認識されないセレクターがインスタンス0x83812e0'エラーに送信されました。

データソースとデリゲートを適切に設定したので、テーブルビュー自体に問題はありません。また、テーブルビューのアウトレットを作成しました。

また、cellforRowAtIndexPathのifステートメントをif(myTable.indexPathForSelectedRow == 0)に変更しようとしました。これにより、すべてのセルで動的なプロトタイプが生成されますが、少なくともアプリは停止しません。

何が問題だと思いますか?

インデックスパスを正しく使用する方法がわかりません。誰かがそれを手伝ってくれるなら、私はそれをいただければ幸いです。

4

3 に答える 3

7

dequeueReusableCellWithIdentifier:ストーリーボードとダイナミックプロトタイプセルを使用すると、nilセルが返されるかどうかを心配したり確認したりする必要はありません。

あなたがしなければならないこと:

  • 各行について、正しいセルIDを決定し、それをにフィードしますdequeueReusableCellWithIdentifier:
  • 動的プロトタイプセルごとに、正しい識別子を設定していることを確認してください(ストーリーボードで各セルを選択し、[属性インスペクター]の[テーブルビューセル]セクションで[識別子]を入力します)

セル識別子を設定する

例を見てみましょう。識別子が「Cell1」、「Cell2」、「Cell3」の3つのプロトタイプセルがあるとします。また、3つの行があり、それぞれがプロトタイプセルの1つで表示されると仮定します。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *identifier = [NSString stringWithFormat:@"Cell%d", indexPath.row + 1];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];

    cell.textLabel.text = identifier; // just show the identifier as title
    return cell;
}
于 2013-02-08T02:58:50.370 に答える
2

あなたはそれが報告していると言いました:

キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:'-[NSIndexPath setTableViewStyle:]:認識されないセレクターがインスタンス0x83812e0に送信されました

cellForRowAtIndexPathが有効なを返さない場合にこれを取得しますUITableViewCell

どのような価値から戻ってきましたtableView:numberOfRowsInSection:か?私が尋ねる理由はcellForRowAtIndexPath、最初の行を除くすべての行で失敗するからです。tableView:numberOfRowsInSection:1より大きい値を指定した場合、アプリはクラッシュします。

これを確認するには、メソッドの先頭に次の行を追加してindexPath、の先頭にあるものを調べます。cellForRowAtIndexPath

NSLog(@"%s: section = %d; row = %d", __FUNCTION__, indexPath.section, indexPath.row);

そうすれば、セルを生成しようとしている行と、それを正しく処理していることを確認できます。

後であなたは言う:

また、cellforRowAtIndexPathのifステートメントをif(myTable.indexPathForSelectedRow == 0)に変更しようとしました。これにより、すべてのセルで動的なプロトタイプが生成されますが、少なくともアプリは停止しません。

それは間違いなく機能しません、そしてそれはどのように機能するかについての混乱を意味しcellForRowAtIndexPathます。現在選択されているセルとは何の関係もありません。応答してnumberOfSectionsInTableViewtableView:numberOfRowsInSection:作成できるセルを通知すると、iOSはcellForRowAtIndexPath、セクション数と行数を指定して表示される可能性があると判断したセルごとに繰り返し呼び出します。

numberOfSectionsInTableViewtableView:numberOfRowsInSection:メソッドが、で正しく処理する値のみを返すようにしてくださいcellForRowAtIndexPath


詳細については、iOS用のテーブルビュープログラミングガイドまたはグーグルの「UITableViewチュートリアル」を参照することをお勧めします。

于 2013-02-08T03:01:41.803 に答える
1

(コメントとして残すのに少し時間がかかったので、直接質問に答えなくてもここに入れておきます)

例外BreakPoint:
ブレークポイントナビゲーターに移動します
ブレークポイントナビゲーターに移動します

ナビゲーターの下部には「+」ボタンがあります
ブレークポイントを追加する

次に、カスタマイズするためのブレークポイントが追加されます。[完了]をクリックするだけで設定が完了します。
[完了]をクリックして完了します

これで、例外がスローされると、例外をトリガーした行に移動します。そして最も重要なのは、その瞬間のコールスタック全体を見ることができるということです。デバッグに非常に役立ちます。

4.2以降、Xcodeのブレークポイントで実行できる「ファンキーな」ものがたくさんあります(正確な時期はわかりません)

于 2013-02-08T02:46:20.347 に答える