如何使用UISwitch创建UITableViewCell并获取数据?

时间:2011-01-03 15:42:42

标签: iphone uitableview uiswitch

我有一个简单的问题。我在Interface Builder中创建了一个包含UISwitch的自定义UITableViewCell。

问题1:更容易,更好的方法吗? 问题2:在UITableViewController中使用时,获取数据的最佳方法是什么?在某些时候,我需要通过表格并检查每个单元格的状态,或者在开关状态直接变化时发送一些反馈?

感谢您的帮助。

5 个答案:

答案 0 :(得分:85)

您只需在附件视图中添加UISwitch即可。这是最简单的方法,更不用说它看起来“优雅”。

然后,在您的tableview控制器代码中,您可以在每次切换开关时调用选择器,甚至可以通过在控制器中获取开关的当前状态来切换开关本身。

请知道您是否需要代码示例。

---示例代码---

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    //add a switch
    UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
    cell.accessoryView = switchview;
    [switchview release];
}

cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];

return cell;
}

然后,您可以使用一种方法根据模型中的更改更新开关。你可以使用你想要的任何东西 - 代表,通知,KVO等。

示例:

- (void)updateSwitchAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
UISwitch *switchView = (UISwitch *)cell.accessoryView;

if ([switchView isOn]) {
    [switchView setOn:NO animated:YES];
} else {
    [switchView setOn:YES animated:YES];
}

 }

答案 1 :(得分:8)

Switch.tag = indexPath.row;
[Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];



- (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{
    FFLog(@"%i",aswitch.tag);
}

答案 2 :(得分:4)

感谢。 我没有你的indexPath,但你可以用像This:

这样的标签识别一个单元格或对象
if (indexPath.row == 0) {
        cell.textLabel.text = @"Twitter";


        UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
        switchview.tag = 111;
        //switchview.selected = 0;
        cell.accessoryView = switchview;

        [switchview addTarget:self action:@selector(updateSwitchAtIndexPath) forControlEvents:UIControlEventTouchUpInside];

        //cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;
        //[switchview release];

    }


- (void)updateSwitchAtIndexPath {

for (UITableViewCell * cell in tblView.subviews) {

   for (UISwitch *swch in cell.subviews) {


         UISwitch *switchView = (UISwitch *)cell.accessoryView;

        if (switchView.tag == 111) {

            if ([switchView isOn]) {
                 NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
            }else{
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
            }

        } 

          if (switchView.tag == 222) {
            if ([switchView isOn]) {
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
            }else{
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
            }

        }
    }
}

}

答案 3 :(得分:3)

两个选项:

1)使用指向数据模型的指针初始化您的单元格。让单元实现交换机的委托回调。当开关改变时,使用指向数据模型的指针来反映新设置。或者,使用指向视图控制器的指针初始化单元格。让单元实现switch委托方法,然后使用适当的单元格上下文信息回调到视图控制器。

2)让你的视图控制器实现switch委托回调。当交换机改变时,确定它是哪个交换机/单元(可能必须将交换机的“标签”属性设置为行号或其他)并在视图控制器的上下文中处理更新。

答案 4 :(得分:1)

要获取Swift 3和Swift 4中UISwitch的值,您可以为其添加目标:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {

    ...

    cell.uiSwitch.tag = 100
    cell.uiSwitch.addTarget(self, action: #selector(ViewController.switchAtValueChanged(switchFromTableViewCell:)), for: UIControlEvents.valueChanged)

    ...
}

你可以得到这样的价值:

@objc func switchAtValueChanged(uiSwitch: UISwitch) {

    if uiSwitch.tag == 100 {
        let value = uiSwitch.isOn
    }
}