2011-10-24 131 views
1

我有一個tableViewController,單元格包含一個按鈕和一個標籤。當用戶點擊按鈕時,我需要獲取單元格的文本(實際上是單元格Person的對象)。tableViewController on button click

當用戶點擊按鈕時,會執行以下方法;

-(void) buttonOfCellClicked{ 
     // here i need to access the `Person` object that the user clicked 
} 

如何編寫此代碼?

編輯:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

人*人= [personsArr objectAtIndex:indexPath.row];

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] ; 

label = [[UILabel alloc]initWithFrame:CGRectMake(15, 5, 75, 60)]; 
label.text =person.firstName; 
[cell addSubview:label]; 
UIButton *button= [UIButton buttonWithType:UIButtonTypeRoundedRect]; 

[button addTarget:self action:@selector(buttonOfCellClicked) forControlEvents:UIControlEventTouchUpInside]; 

[cell.contentView addSubview:button]; 


} 
+0

你可以顯示你的「索引路徑行」單元格代碼? – Aravindhan

+0

我已更新上面的代碼 – Dexter

回答

0

我會繼承UITableviewCell並添加一個屬性和動作到該類,並在IB連接按鈕。當您配置單元格時,只需設置人員對象。這種方法在很大程度上取決於您計劃如何處理該對象。

0

你需要問你的按鈕來告訴你它在哪裏。要做到這一點,你需要調用superview兩次(1X將返回cell.contentView,2X將返回小區):

- (void)buttonOfCellClicked:(UIButton *)sender { 
    UITabvleViewCell *cell = (UITableViewCell *)[[sender superview] superview]; 
} 

然後你就可以訪問例如細胞的特性cell.textLabel.text


編輯:您還需要在cellForRowbuttonOfCellClicked文本添加:-addTarget:action:forControlEvents:

[button addTarget:self action:@selector(buttonOfCellClicked:) forControlEvents:UIControlEventTouchUpInside] 

EDIT2:您可以通過

NSIndexPath *ip = [yourTableView indexPathForCell:cell]; 
Person *p = [personArr objectAtIndex:ip.row]; 
+0

有沒有反正我訪問的對象,而不是它的財產?例如單元格填充'Person.firstName'等。我需要獲取對象'Person'選擇 – Dexter

+0

它是如何填充的?您發佈的代碼不會向我們顯示... – akashivskyy

+0

還有一個標籤,它會像'Person.firstName'一樣填充。有一個'Person'對象的數組,標籤像'Person.firstName'一樣被填充。 – Dexter

-1
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
return [yourArray count];\ 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] ; 

UIButton *button= [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button setTag:indexPath.row]; // SET TAG TO YOUR BUTTON, IT WILL BE SAME AS YOUR OBJECT AT INDEX OF ARRAY 
[button addTarget:self action:@selector(buttonOfCellClicked:) forControlEvents:UIControlEventTouchUpInside]; 

[cell.contentView addSubview:button]; 


} 

-(void) buttonOfCellClicked:(id) sender{ 
    Person *person = [yourArray objectAtIndex:[sender tag]]; 
     // here i need to access the `Person` object that the user clicked 
} 
訪問的人
+0

如果yourArray的內容可以改變,這將停止工作 - 例如,如果可以刪除元素。 –

+0

無論何時從數組中刪除/刪除對象,您都必須刷新tableView才能顯示當前結果。所以它會工作:) – aahsanali

+0

您可以使用 - [UITableView deleteRowsAtIndexPaths:withRowAnimation:]從表中刪除行。您不必刷新整個表格視圖。 –

6
id findAncestor(UIView *view, Class class) { 
    while (view && ![view isKindOfClass:class]) 
     view = [view superview]; 
    return view; 
} 

- (void)buttonOfCellClicked:(UIButton *)button 
{ 
    UITableViewCell *cell = (UITableViewCell *)findAncestor(button, [UITableViewCell class]); 
    UITableView *table = (UITableView *)findAncestor(cell, [UITableView class]); 
    NSIndexPath *path = [table indexPathForCell:cell]; 
    if (!path) 
     return; 
    Person *person = [personsArr objectAtIndex:path.row]; 
    // do whatever with person 
}