addTarget:action:forControlEvents - TableView 中的 UISwitch - 发送方正常,事件始终为 0x0
Posted
技术标签:
【中文标题】addTarget:action:forControlEvents - TableView 中的 UISwitch - 发送方正常,事件始终为 0x0【英文标题】:addTarget:action:forControlEvents - UISwitch in TableView - sender ok, event always 0x0 【发布时间】:2011-05-02 22:01:03 【问题描述】:使用这个论坛中的精彩帖子,我在 tableView 中创建了一个 switch 作为附件视图。当开关被触摸时,我的动作(switchChanged)被调用。只有发送者有有效值,事件为0x0。
向 switchView 添加目标:
[switchView addTarget:self action:@selector(switchChanged:forEvent:) forControlEvents:(UIControlEventValueChanged | UIControlEventTouchDragInside)];
行动:
- (void) switchChanged:(id)sender forEvent:(UIEvent *)event
if(event)
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[[[event touchesForView:sender] anyObject] locationInView:self.tableView]];
IFDFlightlogFormQuestions *question = [self.resultsController objectAtIndexPath:indexPath];
NSLog(@"IFDNewFlightlogViewController_Pad:switchChanged Switch is %@ xmlAttrib %@",[sender isOn],question.XmlAttrib);
[self.xmlResults setValue:([sender isOn])?@"true":@"false" forKey:question.XmlAttrib];
使用action:@selector(switchChanged: forEvent:)
- 增加空间 - 没有变化。
使用 action:@selector(switchChanged::)
- 删除 forEvent
- 无法识别的选择器。
我的目标是获取 tableView 的 indexPath,以便我可以更改字典中的值。
我目前的解决方法是只使用发件人信息,但我想要事件信息:
- (void) switchChanged:(id)sender forEvent:(UIEvent *)event
UISwitch *switchView = (UISwitch *)sender;
UITableViewCell *cell = (UITableViewCell *)switchView.superview;
UITableView *tableView = (UITableView *)cell.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
IFDFlightlogFormQuestions *question = [self.resultsController objectAtIndexPath:indexPath];
NSLog(@"IFDNewFlightlogViewController_Pad:switchChanged Switch is %@ xmlAttrib %@",([sender isOn])?@"On":@"Off",question.XmlAttrib);
[self.xmlResults setValue:([sender isOn])?@"true":@"false" forKey:question.XmlAttrib];
关于获取事件信息的任何指针?
【问题讨论】:
【参考方案1】:可以通过将目标添加到UISwitch
来触发@selector
。
[switchCtl addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];
【讨论】:
【参考方案2】:另一种可能性是在 UISwitch 上设置 tag 属性以匹配 tableview 的行。如果您也使用多个部分,那么您可以想出一些解决方案来将它们编码为单个整数值。请记住,使用这种方法,每次更新单元格时都需要更新标记(tableView:cellForRowAtIndexPath:),因为重复使用单元格时行可能会发生变化。
【讨论】:
【参考方案3】:不幸的是,没有从 UIControl 操作发送forEvent:
...只有第一部分,这就是您看不到任何价值的原因。
您的解决方法是一种合适的方法。
另一种方法是将 UISwitch 子类化,以便它持有对 NSIndexPath 的引用,甚至覆盖
- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
中断并发送自定义事件...
【讨论】:
好的,知道了。谢谢亚当。我将继续使用解决方法。我喜欢继承 UISwitch 的想法,它现在在我的待办事项列表中。以上是关于addTarget:action:forControlEvents - TableView 中的 UISwitch - 发送方正常,事件始终为 0x0的主要内容,如果未能解决你的问题,请参考以下文章