1

問題があります。テーブルがあり、各セルに UISwitch があります。ユーザーがスイッチをクリックすると、どのセルにスイッチが含まれているかを知りたいです。

コードは ios6 と ios 7 で正常に動作しています。

コードは次のようになります。

-(IBAction) doToggle:(id)sender {
UISwitch *toggle = (UISwitch *)sender;
MyCell *cell = (MyCell *)((UISwitch *)sender).superview.superview;
NSLog(@"=========== CELL %@", cell.description);
NSDictionary *item = [list objectAtIndex:[cell index]]; //breaks in this line

NSLog には次のように表示されます

iOS6:

<MyCell: 0x858b750; baseClass = UITableViewCell; frame = (0 0; 320 44); autoresize = W; layer = <CALayer: 0x858b890>>

iOS7:

<UITableViewCellScrollView: 0x8e5a290; frame = (0 0; 320 44); autoresize = W+H; gestureRecognizers = <NSArray: 0x8e5a740>; layer = <CALayer: 0x8e5a4c0>; contentOffset: {0, 0}>

誰かがこれで私を助けることができますか、前もって感謝します!

4

9 に答える 9

4

タグジャグリングよりもはるかにクリーンなソリューションは、デリゲートプロトコルを使用してカスタムセルを作成し、メソッドのターゲット/アクションとセルを UISwitch に追加し、デリゲート (ビューコントローラー) でメソッドを呼び出す-toggleSwitched:(BOOL) switchOnOff onMyCell:(MyCell *) cellことだと思います。このデリゲート メソッドを次のように実装します。

-(void)toggleSwitched:(BOOL) switchOnOff onMyCell:(MyCell *) cell
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    // use indexPath to fetch right element
    // ie:
    if(switchOnOff) {
        NSDictionary *item = list[indexPath.row];
    } else {
        // ??
    }
}
于 2013-08-27T22:50:02.387 に答える
2

iOS7 より前は、セルのスーパービューはUITableViewそれを含む でした。iOS7 GM の時点で (おそらくパブリック リリースにも含まれるでしょう)、セルのスーパービューは でありUITableViewWrapperView、そのスーパービューはUITableViewCell. この問題には 2 つの解決策があります。

解決策 1:UITableViewCellカテゴリを作成する

@implementation UITableViewCell (RelatedTable)

- (UITableView *)relatedTable
{
    if ([self.superview isKindOfClass:[UITableView class]])
        return (UITableView *)self.superview;
    else if ([self.superview.superview isKindOfClass:[UITableView class]])
        return (UITableView *)self.superview.superview;
    else
    {
        NSAssert(NO, @"UITableView shall always be found.");
        return nil;
    }

}
@end

これは を使用するための適切なドロップイン置換でありcell.superview、既存のコードを簡単にリファクタリングできます -- -- 検索して に置き換えるだけ[cell relatedTable]で、将来ビュー階層が変更または元に戻された場合に確実に表示されるようにアサートをスローしますテストですぐにアップします。

解決策 #2: への弱いUITableView参照を追加するUITableViewCell

@interface SOUITableViewCell

   @property (weak, nonatomic) UITableView *tableView;

@end

これははるかに優れた設計ですが、既存のプロジェクトで使用するにはもう少しコードのリファクタリングが必要になります。SOUITableViewCelltableView:cellForRowAtIndexPathをセル クラスとして使用するか、カスタム セル クラスがサブクラス化されていることを確認しSOUITableViewCell、tableView をセルの tableView プロパティに割り当てます。セル内では、 を使用して含まれているテーブルビューを参照できますself.tableView

于 2013-09-18T14:58:22.370 に答える
2

この方法でデータを取得しようとするべきではありません。ご覧のとおり、iOS 6 と iOS 7 ではセルの構造が明らかに異なります (iOS 7 はまだ NDA の対象であるため、これについては詳しく説明できません)。サブビュー パスを「登る」ことによってセルを取得するのではなく、スイッチに indexPath.row と等しいタグを付けてから、それを使用してデータ ソースにクエリを実行し、辞書を取得します。

-(IBAction) doToggle:(UISwitch *)sender {

    NSDictionary *item = list[sender.tag];
} 
于 2013-08-27T22:04:58.037 に答える
1

私のようにシンプルで汚い修正が好きな人にとっては、これで問題が解決すると思います!!! 乾杯!!!!!

// Patch to get the table view cell because in iOS7 the superview is a butch
- (UITableViewCell *) getTableViewCellFromSubview:(UIView*)subview
{
    UITableViewCell* tableViewCell = nil;

    while (subview.superview != Nil) {
        if ([subview.superview isKindOfClass:[UITableViewCell class]]) {
            tableViewCell = (UITableViewCell*)subview.superview;
            break;
        } else {
            subview = subview.superview;
        }
    }

    return tableViewCell;
}
于 2013-11-05T07:26:44.087 に答える
1

私は同じ問題を抱えています。このコードは " " 保証されていません(UITableViewCell *)[[[self superview] superview] superview];。このコードは iOS7 で動作します。

-(void)buttonClicked:(id)sender
{
    UIButton *button=(UIButton*)sender;
    UITableViewCell *selectedCell = (UITableViewCell*)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:button.tag inSection:0]];
    NSLog("%@",selectedCell.lblTitle.text);
}
于 2013-10-12T13:55:48.517 に答える
1

開発者の多くは、カスタム ビューを使用して、古いバージョンの iOS のテーブル ビューにカスタム セルを表示していました。あなたがその 1 人である場合、ボタン クリック アクションが iOS7 で機能しなくなるという問題に直面する必要があります。

これを解決する方法:

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

オプション 1: ビューを取得する代わりに、新しいテーブル セルを使用して新しいレイアウトを作成します。すべてのレイアウトをテーブルセルに再度配置します。

私は知っています、これには多くの努力が必要です。これをしたくない場合は、非常に小さなハックがあります: オプション 2

オプション 2:ボタンの IBOutlet を作成し、このボタンをセルのコンテンツ ビューのサブビューとして追加します。

[self.myCell.contentView addSubview:self.btn_click];

上記のコード行は、コンテンツ ビューのサブビューとして btn_click を追加します。これで、ボタン クリック アクションが機能するはずです。

オプション 3:

最良の方法 :

i) アウトレット UITableViewCell を取得します。ii) 既存のビューを新しいテーブル セルのサブビューとして作成します。iii) カスタム セルの既存のビューへの接続を切断し、それを新しい UITableViewCell に接続します。

以上で、IBAction が機能するようになります。

「クラスはキー値コーディングに準拠していません。」というエラー メッセージでクラッシュした可能性があります。古いビュー接続を確認し、黄色のマークが付いているすべての接続を削除します。

于 2013-09-30T15:26:01.717 に答える
1

これを試してみてください。私にとってはうまくいきます。

NSIndexPath *indexPath;
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1)
{
    indexPath = [self.tableview indexPathForCell:(UITableViewCell*)[[senderButton superview] superview]];

}
else
{
    indexPath = [self.tableview indexPathForCell:(UITableViewCell*)[[[senderButton superview] superview] superview]];
}

NSLog(@"table row - %d and table column - %d",indexPath.row , indexPath.section);
于 2013-12-02T05:23:42.103 に答える