5

ここに投稿されたいくつかのアプローチを試しましたが、テーブルをスイッチでいっぱいにして、変更されたスイッチのセルのインデックス値を返すことができません。プログラムでテーブルを含むビューを作成しています(xibなし)。

TableSandboxAppDelegate.mビュー コントローラーを次のようにインスタンス化しますdidFinishLaunchingWithOptions:

...
TableSandboxViewController *sandboxViewController = [[TableSandboxViewController alloc]
    init];
[[self window] setRootViewController:sandboxViewController];
...

TableViewController.hファイルの読み取り:

@interface TableSandboxViewController : UITableViewController
{
   NSMutableArray *_questionOrder;
   NSMutableArray *switchStates;
}
@end

TableViewController.m の cellForRowAtIndexPath:読み取り:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];

UISwitch *theSwitch = nil;

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:@"MainCell"];

    theSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
    theSwitch.tag = 100;
    [theSwitch addTarget:self action:@selector(switchChanged:)   
        forControlEvents:UIControlEventValueChanged];
    [cell.contentView addSubview:theSwitch];

} else {
    theSwitch = [cell.contentView viewWithTag:100];
}

if ([[switchStates objectAtIndex:indexPath.row] isEqualToString:@"ON"]) {
    theSwitch.on = YES;
} else {
    theSwitch.on = NO;
}

return cell;

TableViewController.m の -(IBAction)switchChanged:(UISwitch *)sender読み取り:

UITableViewCell *theParentCell = [[sender superview] superview];
NSIndexPath *indexPathOfSwitch = [self.tableView indexPathForCell:theParentCell];

NSLog(@"Switch changed at index: %d", indexPathOfSwitch.row);

私のログ結果は常に「Switch changed at index: 0」です。問題は、「送信者」の置換の組み合わせ([送信者スーパービュー]、[[送信者スーパービュー]スーパービュー]など)を試したCGPoint行にあるように感じます。その行がテーブルを表示するビューを指しているようには感じません。

私は何を間違っていますか?

10 月 9 日 9:15 EDT に追加されたメモ:私の目標は、テーブル内の約 100 の「はい/いいえ」の質問を処理できるようにすることです。そのため、再利用が重要です。スクロールして各スイッチの状態をテーブルに表示し、ビューを離れるときにそれらを取得できるようにしたい。

4

6 に答える 6

6

切り替えビュー タグを行インデックスに設定できます。それ以外のtheSwitch.tag = 100;

行う

-(UITableViewCell*)tableView:table cellForRowAtIndexPath:indexPth
{
    UISwitch *theSwitch = nil;
    if (cell == nil) {
        ...
        // as per your example
        [cell.contentView addSubview:theSwitch];
    } else {
        theSwitch = subviewWithClass(cell.contentView, [UISwitch class]);
    }

    theSwitch.tag = indexPath.row;
    ...
}

このヘルパー関数を追加して、viewWithTag:呼び出しを置き換えます

UIView *subviewWithClass(UIView *contentview, Class klass)
{
    for (UIView *view in contentview.subviews)
        if ([view isKindOfClass:klass])
            return view;
    return nil;
}

次に、switchChanged 関数で、行インデックスであるタグを取得します

-(IBAction)switchChanged:(UISwitch *)sender {
    NSLog(@"Selected Switch - %d", sender.tag);
    ...
 }
于 2013-10-09T03:16:06.177 に答える
1

ブロックベースのもの ( https://github.com/brightsoftdev/iOS-Block-Based-Bindings/blob/master/UISwitch%2BBindings.mなど) を使用する場合、行の取得について心配する必要はありません。ブロックの tableView:cellForRowAtIndexPath: に渡される indexPath を参照できるためです。

于 2013-10-10T01:10:15.407 に答える
0

UISwitch のサブクラスを作成し、indexPath プロパティを追加してから、cellForRowAtIndexPath で indexPath を設定するだけです。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    SwitchCell *returnCell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCell" forIndexPath:indexPath];
    returnCell.switch.indexPath = indexPath;

    return returnCell;
}
于 2013-10-10T16:40:29.897 に答える