2013-05-18 85 views
0

我有一個UITableView我爲其創建了一個自定義的UITableViewCell。 tableview中的每一行都有一個按鈕。我想知道點擊一個按鈕的部分編號,以便我知道點擊了哪個部分的按鈕。我已經嘗試了幾個堆棧中找到的東西,但沒有任何工作。如何知道UITableView中按鈕點擊Tableview單元格的段號?

UIButton *b = sender; 
NSIndexPath *path = [NSIndexPath indexPathForRow:b.tag inSection:0]; 
NSLog(@"Row %d - Section : %d", path.row, path.section); 
+0

顯示一些代碼,你試過這是不適合你的工作。 –

+0

UIButton * b =發件人; NSIndexPath * path = [NSIndexPath indexPathForRow:b.tag inSection:0]; (@「Row%d - Section:%d」,path.row,path.section); –

回答

3

進行點擊的方法時,你可以用它創建按鈕單擊處理程序,並在tableView:cellForRowAtIndexPath:方法添加它

- (void)buttonPressed:(UIButton *)button{ 

    UITableViewCell *cell = button.superView.superView; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    //Now you have indexPath of the cell 
    //do your stuff here 

} 
+0

更好的方法來做到這一點。 - (IBAction)buttonClicked:(id)sender {cellViewView = sender; while([cellView isKindOfClass:[UITableViewCell class] == NO){cellView = [cellView superview]; } UITableViewCell * cell =(UITableViewCell *)cellView; // Get cell id view = [cell superview]; ([view isKindOfClass:[UITableView class] == NO){ view = [view superview]; } UITableView * tableView =(UITableView *)view; //獲取tableview NSIndexPath * indexPath = [tableView indexPathForCell:cell]; } – knocker

+0

@knocker感謝您的評論。但我相信'indexPathForRowAtPoint:'是一個非常推薦的。 – Anupdas

+0

是的,你是對的。我的要點是從按鈕button.superview.superView獲取單元格將無法正常工作。 id cellView = sender; {cellView isKindOfClass:[UITableViewCell class] == NO) } UITableViewCell cell =(UITableViewCell)cellView; //獲取cell ID 這將是正確的方法.. – knocker

0

當您在cellForRowAtIndexPath創建自定義的UITableViewCell,你應該把它傳遞了其作爲參數部分。它可能看起來像:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

    if (!cell) 
    { 
    cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier" section:indexPath.section] autorelease]; 
    } 

    return cell; 
} 

現在你的知道它的部分和MyCustomCell

0

嘗試此,

首先指定部分作爲標記來按鈕也cellForRowAtIndexPath方法上按鈕添加目標。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    [cell.btnSample setTag:indexPath.section]; 
    [cell.btnSample addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    ... 
} 

獲取部分從IBAction爲發件人你定義(這裏buttonClicked)標籤。

-(IBAction)buttonClicked:(id)sender 
{ 
    NSLog(@"Section: %d",[sender tag]); 
} 
5

不知道你試過了什麼,但我可能會這樣做。在這裏,從記憶中做一些僞代碼。

- (void)buttonClicked:(id)sender { 
    CGPoint buttonOrigin = [sender frame].origin; 
    // this converts the coordinate system of the origin from the button's superview to the table view's coordinate system. 
    CGPoint originInTableView = [self.tableView convertPoint:buttonOrigin fromView:[sender superview]; 

    // gets the row corresponding to the converted point 
    NSIndexPath rowIndexPath = [self.tableView indexPathForRowAtPoint:originInTableView]; 

    NSInteger section = [rowIndexPath section]; 

} 

如果我想清楚了,這給你的靈活性的情況下,該按鈕不是直接UITableView細胞內。說,如果你嵌入一些中間視圖。

可悲的是,似乎沒有要在iOS相當於NSTableView的的rowForView:

+0

我會建議這種方式,而不是做sender.superView.superView,因爲我們可以有任何級別的嵌套os視圖,但這種方式適用於所有。 – CRDave

+0

但我喜歡建議使用這一行而不是兩行CGPoint originInTableView = [發件人convertPoint:CGPointMake(0,0)toView:self.tableView] ;.我們既可以使用也可以正常工作。 – CRDave

+0

是的,@CRDave也可以。我爲這個答案而放棄冗長的一面,所以它會更清楚地發生了什麼。 – Jablair

相關問題