我有一个简单的问题。我在Interface Builder中创建了一个包含UISwitch的自定义UITableViewCell。
问题1:更容易,更好的方法吗? 问题2:在UITableViewController中使用时,获取数据的最佳方法是什么?在某些时候,我需要通过表格并检查每个单元格的状态,或者在开关状态直接变化时发送一些反馈?
感谢您的帮助。
答案 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
}
}