當我添加一個UIView子類對象到一個UIView - 例如UITableViewCell原型內的一個UISwitch,我通過IBAction將這個開關與一個ViewController連接起來,我怎麼能在這個動作中發現哪個錶行是被調用的UISwitch?從子視圖引用包含UIView?
我附有影像僅僅是明確的 - 在調用UISwitch的時候,我想知道調用UISwitch是在哪一行
當我添加一個UIView子類對象到一個UIView - 例如UITableViewCell原型內的一個UISwitch,我通過IBAction將這個開關與一個ViewController連接起來,我怎麼能在這個動作中發現哪個錶行是被調用的UISwitch?從子視圖引用包含UIView?
我附有影像僅僅是明確的 - 在調用UISwitch的時候,我想知道調用UISwitch是在哪一行
我認爲「最乾淨」的方式來做到這一點。是讓交換機將其行爲發送給單元本身。您需要繼承UITableViewCell以實現該操作,並將其自身傳遞給視圖控制器上的一個方法(可能通過爲該單元賦予視圖控制器所關聯的委託)。這是一個相當的盛況;下面有更直接但不太合適的方法。
一種方法是在首先配置表格視圖單元格時(即在tableView:cellForRowAtIndexPath:
方法中)在UISwitch上指定tag
。像switch.tag = indexPath.row
;之後您可以通過詢問其標籤來從交換機中檢索該行。
另一種方法是通過UISwitch的超級查找向上搜索,直到找到UITableViewCell並找到它的行。例如:
UIView *view = switch.superview;
while (view && ![view isKindOfClass:[UITableViewCell class]]) {
view = view.superview;
}
// at this point, view is nil or a table view cell; ask the table view for its index path
if (view) {
NSIndexPath *path = [tableView indexPathForCell:cell];
}
太棒了!謝謝!! – 2012-07-07 15:01:53
我剛剛發現第一種方法不適用,因爲細胞的可重用性。 – 2012-07-08 16:36:50
第一種方法應該可以正常工作,只要您在每次從'tableView:cellForRowAtIndexPath:'返回單元格時將標籤分配給開關即可。 – 2012-07-08 18:41:49