2011-12-13 40 views
2

我在我的TableViewCells中嵌入了UIButtons。爲了追蹤按鈕屬於哪個單元格,我想將一個NSIndexPath屬性添加到UIButton中。我不想子類化一個UIButton。有沒有辦法我可以用類別做到這一點?將屬性添加到UIControls而不進行子類化

編輯:我相信設置標籤的想法不會工作,如果我在表視圖中有多個部分。訪問按鈕的超級視圖超級視圖來確定單元格的另一種方法看起來更像是一種黑客攻擊。尋找更乾淨的方式來做到這一點。

回答

4

有幾種方法。如果你真的需要一個數字而不是完整的索引路徑,你可以使用setTag:。它不靈活,但它很容易獲得。

下一個最佳解決方案是associative references。這些可以將數據掛到任何對象上,並進行適當的內存管理。我通常創建一個類別,添加使用objc_setAssociatedObjectobjc_getAssociatedObject執行的屬性。

4

您可以找出單擊按鈕所在的單元格,而無需將標記或索引路徑與按鈕相關聯,這樣在重新使用單元格時會變得混亂。標籤可以與分段表一起工作,但你必須與數字混淆,例如10001是第1節,第1行,所以你必須在一端進行轉換,並在另一端進行轉換,這對我來說太脆弱了。

更好的方法是使用UITableView的indexPathForRowAtPoint:方法。當你的按鈕的動作被激活(假設目標是在你的表視圖控制器:

CGPoint point = [sender convertPoint:sender.center toView:self.tableView]; 
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point]; 

sender這裏被轉換爲UIButton

1

爲了跟蹤按鈕所屬

哪個小區。

您已經知道按鈕屬於哪個單元格:按鈕是子視圖的單元格。

  1. 從對按鈕的引用開始。 (如果你的這個按鈕,這個是self。如果你是按鈕的動作目標,那麼當按鈕被點擊併發出一個動作消息時,它將自己作爲參數傳遞給動作消息,通常稱爲sender

  2. 查看視圖層次結構(superview)以查找包含該按鈕的UIViewTableCell。

    UIView* v = theButton; 
    while (![v isKindOfClass: [UITableViewCell class]]) v = v.superview; 
    
  3. 現在你可以做任何你喜歡的信息。例如,你似乎想要一個NSIndexPath;然後致電-[UITableView indexPathForCell:]