3

UINavigationController の UITableView でストーリーボードを使用しています。この UITableView では、内部プロパティを持つカスタム tableViewCell を使用しました。

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

    CustomTableViewCell *cell = nil;

    if (SYSTEM_VERSION_LESS_THAN(@"6.0") ) {

        //iOS 6.0 below
        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    }
    else {
        //iOS 6.0 above

        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; //work segue

    }

上記のコードは、プッシュ セグエでうまく機能します。しかし、私が使用したときではありません

     cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];   //not work segue

セルの再利用からセルのデータを保持するために、この alloc メソッドを使用しました。

alloc と deque.. メソッドの違いです。私は何が欠けていますか?

編集) dequeReusableCell メソッドを使用しないことは、パフォーマンス上の理由で悪いことを知っています。しかし、細胞の数は多くありません。これが deque メソッドを必要としない理由です。

  1. 「動作しない」とは、クラッシュではなく、「プッシュセグエを実行しない」ことを意味します。

    セルの右側の開示インジケータ アイコンを除いて、dequeReusable メソッドを使用した場合と同じようにセルを表示します。インジケーター アイコンは、ストーリーボード設定から取得されます。

    そして、セルに触れると、セルは青く強調表示されますが、プッシュセグエは実行されません。

  2. CustomTableViewCell には 4 つのプロパティがあります。それはすべてUITableViewCellとは異なります。ユーザーは DetailViewController でプロパティを設定します (プッシュ セグエはこれにつながります)。セルに IBOutlet ref がありません。MasterViewController(tableViewを持つ)では、cellForRowAtIndexPathメソッドは上記コードのCustomTableViewCellを返します。

  3. cellForRowAtIndexPath メソッドは、CustomTableViewCell のインジケーターの左側にオン/オフ ボタンを追加し、セルのタグ番号を設定します。

4

1 に答える 1

8

を使用dequeueReusableCellWithIdentifierすることで、プロトタイプ セルを使用できるようになります。initWithStyleの代わりにを使用する場合は使用dequeueReusableCellWithIdentifierしないため、これらのセル プロトタイプに対して定義したセグエ、開示インジケーター、その他の UI の外観も失われます。

この道を行くと決心した場合は、「古い学校」に行き (つまり、セル プロトタイプの前に私たちが行っていたことを行う)、独自の を作成する必要がありますdidSelectRowForIndexPath。しかし、そのセグエがすでに定義されている場合は、それを「SelectRow」と呼んだとしましょう。それdidSelectRowForIndexPathを実行できます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    [self performSegueWithIdentifier:@"SelectRow" sender:cell];
}

開示インジケータが必要な場合は、カスタム セル ルーチン (またはcellForRowAtIndexPath) で手動で設定する必要があります。そして、それを追加すると

cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

次に、手動で処理する必要があります。

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    [self performSegueWithIdentifier:@"SelectAccessory" sender:cell];
}

要するに、これを機能させることはできますが、多くの余分な作業を行い、セルをデキューすることのパフォーマンスとメモリの利点を失うだけです。を使用しないという決定を再検討することを心からお勧めしますdequeueCellWithIdentifier

于 2013-02-22T19:51:49.870 に答える