5

私はそれらを持ってUITableViewUISwitchsます。

テーブルビュー

スイッチが切り替えられたら、機能を実行したいと思います。この関数は、スイッチがオンまたはオフであり、スイッチがオンに変更された行をログに記録するだけです。私が抱えている問題は、スイッチをクリックすると、スイッチをクリックする前にその行をクリックしない限り、正しい行が記録されないことです。

私の問題は、スイッチをクリックしても行が選択されないことだと思います。行を選択するか、ID をスイッチに追加できるようにするにはどうすればよいですか?

したがって、スイッチ ID「1」は「ON」です。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"POICell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


    //set the cell text to the catName
    cell.textLabel.text = [self.catNames objectAtIndex:[indexPath row]];
    //add switch 
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
    cell.accessoryView = switchView;
    [switchView setOn:YES animated:NO];

    [switchView addTarget:self action:@selector(switchChanged: ) forControlEvents:UIControlEventValueChanged];
    // Configure the cell...

    return cell;
}

     - (void) switchChanged:(id)sender {
            NSString *StrCatID =[[NSString alloc]init];
            StrCatID = [self.catIDs objectAtIndex:[self.inputTableView indexPathForSelectedRow].row];
            UISwitch* switchControl = sender;
            NSLog( @"The switch for item %@ is %@",StrCatID, switchControl.on ? @"ON" : @"OFF" );
        }
4

7 に答える 7

9

スイッチを保持しているセルを見つけるには

UISwitch *switchInCell = (UISwitch *)sender;
UITableViewCell * cell = (UITableViewCell*) swithInCell.superview;

そのセルのインデックスパスを見つけるには

NSIndexPath * indexpath = [myTableView indexPathForCell:cell]

あなたの場合

 - (void) switchChanged:(id)sender {

         UISwitch *switchInCell = (UISwitch *)sender;
         UITableViewCell * cell = (UITableViewCell*) swithInCell.superview;
         NSIndexPath * indexpath = [myTableView indexPathForCell:cell]
         NSString *strCatID =[[NSString alloc]init];
         strCatID = [self.catIDs objectAtIndex:indexpath];
         NSLog( @"The switch for item %@ is %@",StrCatID, switchInCell.on ? @"ON" : @"OFF" );
        }
于 2012-10-29T12:09:04.870 に答える
9

メソッドでそれぞれにIndexPath.rowタグとして設定する必要がありますSwitchcellForRowAtIndexPath

 switchView.tag= indexPath.row;

そして、スイッチの値を変更すると、行番号が表示されます

- (void) switchChanged:(UISwitch *)sender {
  int rowIndex =[sender tag];
  //rowIndex you may use it further as you wanted.   

}

于 2012-10-29T12:09:14.893 に答える
5

mySwitch.superview.superview適切なセルを取得するには、二重にする必要がありました。

これが例です

- (void)switchToggle:(UISwitch *)mySwitch
{

 UITableViewCell *cell = (UITableViewCell *)mySwitch.superview.superview;
 NSIndexPath *indexpath = [self.tableView indexPathForCell:cell];
 NSLog(@"toggle section %d rowID %d", indexpath.section, indexpath.row);

}
于 2013-11-17T20:48:19.743 に答える
1

これを行うより良い方法は、送信者がどのセルにいるかを判断することです。

- (UITableViewCell *)findCellForView:(UIView *)view
{
    for (; view != nil; view = view.superview)
        if ([view isKindOfClass:[UITableViewCell class]])
            return view;
    return nil;
}

この方法ができたら。それからそれはと交換することの問題[self.inputTableView indexPathForSelectedRow]です

UITableViewCell *cell = [self findCellForView:sender];
NSIndexPath *indexPath = [self.inputTableView indexPathForCell:cell];
于 2012-10-29T12:06:26.187 に答える
1

問題は、 dequeueReusableCellWithIdentifier を使用していて、すべてのセルが同じ ID を持っていることだと思います。

于 2012-10-29T11:59:57.190 に答える