2011-05-02 16 views
3

在這個論壇中使用了精彩的帖子,我在tableView中創建了一個作爲accessoryView的開關。當觸摸開關時,我的動作(switchChanged)被調用。只有發件人有一個有效的值,事件是0x0。addTarget:action:forControlEvents - TableView中的UISwitch - 發件人ok,事件總是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])[email protected]"true":@"false" forKey:question.XmlAttrib]; 
    } 
} 

使用action:@selector(switchChanged: forEvent:) - 增值空間 - 沒有變化。

使用action:@selector(switchChanged::) - 刪除forEvent - 無法識別的選擇器。

我的目標是獲得indexPath到tableView,以便我可以更改我的字典中的值。

我目前的解決辦法是使用僅僅是發件人信息,但我想事件信息:

- (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])[email protected]"On":@"Off",question.XmlAttrib); 
    [self.xmlResults setValue:([sender isOn])[email protected]"true":@"false" forKey:question.XmlAttrib];   
} 

在得到這個事件信息任何指針?

回答

0

不幸的是沒有forEvent:是從一個UIControl行動發送......只有第一部分,這就是爲什麼你沒有看到任何價值。

您的解決方法的工作方式是一種合適的方法。

另一種方法是子類UISwitch所以它舉到NSIndexPath參考,甚至覆蓋

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event 

中斷和發送自定義事件......

+0

好的,明白了。謝謝你,亞當。我將繼續使用該解決方法。我喜歡UISwitch的子類化想法,它現在在我的待辦事項列表中。 – Kent 2011-05-03 00:00:36

2

另一種可能性是設置UISwitch上的標籤屬性與您的tableview的行相匹配。如果您也使用多個部分,那麼您可以想出一些解決方案將這些部分編碼爲一個整數值。請記住,使用這種方法,每次更新單元格時都需要更新標記(tableView:cellForRowAtIndexPath :),因爲行可以隨着單元格的重用而更改。

5

可以通過向UISwitch添加目標來觸發@selector

[switchCtl addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];