4

我有动态 tableView 和一个问题。每个 tableCell 中有两个按钮。我试图让 indexPath.row 触摸按钮但没有成功。

我的代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    NSIndexPath *indexPath = [self.homeTableView indexPathForSelectedRow];      

    NSLog(@"%d", indexPath.row);


}

我怎样才能为触摸按钮获取 indexPath.row (Segue 连接在这两个按钮上-> 两个连接)?

4

6 回答 6

10

Apple change the UITableViewCell hierarchy in iOS 7

Using iOS 6.1 SDK

<UITableViewCell>
   | <UITableViewCellContentView>
   |    | <UILabel>

Using iOS 7 SDK

<UITableViewCell>
   | <UITableViewCellScrollView>
   |    | <UITableViewCellContentView>
   |    |    | <UILabel>

So if you want to get indexpath at button index then use following code Using iOS 6 or later SDK

UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
    NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
    NSLog(@"index=%@",clickedButtonPath);

Using iOS 7 or 7+ SDK

 UITableViewCell *clickedCell = (UITableViewCell *)[[[sender superview] superview]superview];
    NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
    NSLog(@"index=%ld",(long)clickedButtonPath.item);
于 2013-10-07T06:55:38.893 回答
10

它不起作用,因为您在单击按钮时没有选择行。

使用两个按钮,我会将您的 segues 与按钮断开连接,并在 IB 中执行 2 个手动 segues,然后添加类似的代码来处理它们:

-(void)button1Pressed:(id)sender {
    UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
    NSIndexPath *clickedButtonIndexPath = [self.homeTableView indexPathForCell:clickedCell];
    ...
    [self performSegueWithIdentifier:@"YourManualSegueIdentifier1" sender:self];
}

编辑第二个选项:

在您的 MyTableViewCell.h 中:

@interface MyTableViewCell : UITableViewCell
    ...    
    @property (strong, nonatomic) NSIndexPath *cellIndexPath;
    ...
@end

在您的 MyTableViewCell.m 中:

-(void)button1Pressed:(id)sender {
    ...
    NSInteger row = cellIndexPath.row;
    ...
}

在您的 MyTableViewController.m 中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];      
    }
    // remember index here!
    [cell setCellIndexPath:indexPath];
    ....
    return cell;
}
于 2012-10-22T15:45:51.883 回答
6

我没有使用情节提要,但是一旦我在基于简单 viewconroller 的项目中使用它,我认为这可能会对您有所帮助。

 - (IBAction)goToNew:(id)sender 
{
   UIButton *btn = (UIButton*) sender;
   UITableViewCell *cell = (UITableViewCell*) [btn superview];
   NSIndexPath *indexPath = [tableView indexPathForCell:cell]; 
   int row = indexPath.row;
}
于 2012-10-22T15:38:14.953 回答
1

也许触摸发生在 UIButton 而不是 UITableView / UITableViewCell 上。

检查:

NSLog(@"%@",[sender class]);
于 2012-10-22T15:32:35.613 回答
0

给按钮tag = indexpath.row+100;

并得到..

-(IBAction)ShowListView:(id)sender
{

    UIButton *btn = (UIButton *)sender;

    int Iindex = btn.tag-100;

    NSLog(@"button title is %@",btn.titleLabel.text);
    NSLog(@"button id is %d",Iindex);

    NSLog(@"array category is....%@",arrayCategory);
于 2013-10-07T06:59:51.493 回答
0

解决了 button.tag

在“cellForRowAtIndexPath”中,我设置了 button.tag = indexPath.row,然后在“- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {”

UIButton *btn = (UIButton*) sender;
NSLog(@"%d", btn.tag);
于 2012-10-22T17:21:28.890 回答