2012-07-25 94 views
0

我有自定義單元格在由自定義類(.h和.m文件)定義的UITableView中。我能夠顯示單元格,並更改列表中每個單元格的文本,但是我的自定義單元格中也有按鈕(實際上是兩個)。當我點擊按鈕時,我需要知道哪個行的按鈕已被點擊。有沒有什麼辦法可以在自定義的ui單元類中得到它?每行的按鈕UITableView

我希望我的要求很明確。如果沒有,請隨時發表評論,我會盡力解釋。

回答

2

您可以使用此方法:

  1. 與每個按鈕關聯的對象值。

    @implementation UIButton (AssociatedObject) 
    
    -(void)setAssociatedObject:(id)object 
    { 
        objc_setAssociatedObject(self, @"_associatedObject", object, OBJC_ASSOCIATION_RETAIN_NONATOMIC) ; 
    } 
    
    -(id)associatedObject 
    { 
        return objc_getAssociatedObject(self, @"_associatedObject") ; 
    } 
    
    @end 
    

    使用此類似這樣的:你可以通過添加一個類別的UIButton

    @interface UIButton (AssociatedObject) 
    @property (nonatomic, retain) id associatedObject ; 
    @end 
    

    實現支持此

    myButton.associatedObject = <some object> 
    
  2. 設置動作/目標到您的視圖控制器(或可能桌子代表)

    [ myButton addTarget:<view controller> action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside ] ; 
    
  3. 在您的操作中,查看發件人的關聯對象。發件人將是你的UIButton

    -(void)buttonTapped:(UIButton*)sender 
    { 
        // retrieve object associated with the tapped button: 
        id associatedObject = sender.associatedObject ; 
    } 
    
2

你不顯示任何代碼發表評論,但總體來講,您可以:

  1. 定義每個代表錶行按鈕tag按鈕出現在哪裏;

  2. 當你的按鈕操作方法被調用時,你可以訪問按鈕的屬性tag來知道它是哪一行。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        { 
         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
         if (cell == nil) { 
         ... 
         } 
         ... 
         [button setTag:indexPath.row]; 
         ... 
        } 
    
    
        - (void)buttonPressedAction:(id)sender 
        { 
         UIButton *button = (UIButton *)sender; 
         int row = button.tag; 
        } 
    

更詳盡的解決方案,看看this S.O. thread

+0

+1爲您的按鈕指定一個標籤是要走的路。 – Stunner 2012-07-25 21:16:05

+0

謝謝,會盡力回覆你。 :) – Kgrover 2012-07-25 21:34:12

+0

如果用戶可以在不重新加載數據的情況下在表中插入/刪除/重新排序行,則此解決方案將不起作用。 – Argentumko 2012-11-06 08:29:55

0

我已經通過爲自定義單元類創建並且然後使UIViewController爲每個自定義單元處理UITableViewdelegate來完成此操作。

然後接上了UIButtonIBAction在打了一個電話給它的委託有關它或信息,我需要地作用於細胞信息的自定義單元格類。

所以我會成立一個的東西,如:

@protocol CustomCellDelegate <NSObject> 

- (void) cellButtonPressed:(NSDictionary *)stuffForDelegate; 

@end 

然後當我在ViewController實施cellButtonPressed:我會用stuffForDelegate,以確定哪些細胞是還是什麼信息,我需要採取行動。

tag方法沒問題,但是我覺得處理所有標籤飛行的問題非常繁瑣,我更喜歡使用對象和協議以及代表。