使用UIButton自定义UITableView单元格不调用didSelectRowAtIndexPath

时间:2014-10-05 19:43:36

标签: ios xcode uitableview uibutton

我知道这可能会发生,但是当我点击按钮时,我无法找到一种方法来调用此方法。方法被调用但选择了错误的单元格。

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object{
_postCell = (postCell *) [self.tableView dequeueReusableCellWithIdentifier:@"postCell"];
_postCell.personStringPost.text = [object objectForKey:@"stringPost"];
[_postCell.nameLabel setTitle:[object objectForKey:@"User_Name"]  forState:UIControlStateNormal];
_postCell.userId = [object objectForKey:@"userId"];
_postCell.selectionStyle = UITableViewCellSelectionStyleNone;

PFFile *imageFile = [object objectForKey:@"profileImage"];
NSData *data = [imageFile getData];
_postCell.profileImage.image = [UIImage imageWithData:data];

[_postCell.nameLabel addTarget:self action:@selector(personProfile:tableView:) forControlEvents: UIControlEventTouchUpInside];
[_postCell.profileImageButton addTarget:self action:@selector(personProfile:tableView:) forControlEvents:UIControlEventTouchUpInside];

    return _postCell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
postCell *cell = (postCell *)[tableView cellForRowAtIndexPath:indexPath];
self.userId = cell.userId;
NSLog(@"Did Select: %@", self.userId);
}

- (void) personProfile: (NSIndexPath *) indexPath tableView: (UITableView *) tableView{
[self tableView:tableView didSelectRowAtIndexPath:indexPath];
 [self performSegueWithIdentifier:@"personProfile" sender:self];
}

3 个答案:

答案 0 :(得分:2)

我希望它能提供帮助

处理只有一个部分的按钮时

in cellfor row method

yourcell.mybutton.tag=indexPath.row;

-(void)myCellbuttonAction:(id)sender
{
   UIButton *button = (UIButton *)sender; // first, cast the sender to UIButton
  NSInteger row = button.tag; // recover the row
  NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];

  // apply your logic for indexpath  as in didselect row   
}

在处理多个部分和多行时,这可能对您有所帮助

用于行方法的单元格

yourcell.tag=indexPath.section;
yourcell.contentview.tag=indexPath.row;

,您的按钮操作可能如下所示

-(void)myCellbuttonAction:(id)sender
{
UIButton *button = (UIButton *)sender; // first, cast the sender to UIButton

id rowid =[button superview];
id sectionid = [rwoid superview];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[rowid tag] inSection:[sectionid tag]];

 // apply your logic for indexpath  as in didselect row   
}

答案 1 :(得分:1)

这里有一些事情。

a)我不会在你的cellForRowAtIndex方法中使用实例变量(_postCell)。您可能会遇到单元重用问题,这可能是您的错误的根源。将其替换为局部变量:

postcell *cell = (postCell *)[self.tableView dequeueReusableCellWithIdentifier:@"postCell"];

您还需要将所有对_postCell的引用替换为cell

b)请注意,在同一行中,您的演员使用小写= (postCell *)... - 我已经完成了相同的操作,但最好将类名称以大写字母开头。

c)您有一个名为nameLabel的属性,它建议使用UILabel,但您使用的是setTitle:forState:方法,这意味着它是UIButton。我会重命名这个属性,因为如果名称与类匹配(或者至少不暗示错误的类),调试会更容易。

d)当您调用addTarget:action:forControlEvents方法时,您的选择器适用于personProfile:tableView:。该方法的签名适用于NSIndexPath和UITableView。但是你的按钮不会发送那些类型的参数。它将发送发件人的详细信息 - 即触发操作的按钮。因此,您需要修改您的方法以接受该类型的参数:

[cell.nameLabel addTarget:self action:@selector(buttonPressed:) forControlEvents: UIControlEventTouchUpInside];

e)当调用该方法时,您需要一种方法来确定发送按钮所在的单元格。理想情况下,您可以将UIButton子类化为添加一些指向单元格的链接,但是(如果您只有一个部分)可能会将行号作为标记。为此,请添加:

cell.nameLabel.tag = indexPath.row;

cellForRowAtIndexPath:。然后,您可以实现一种不同的方法来处理按钮按下,如下所示:

-(void)buttonPressed:(id)sender {
    UIButton *button = (UIButton *)sender; // first, cast the sender to UIButton
    NSInteger row = button.tag; // recover the row
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0]; // derive the indexPath, assuming section is 0
    [self.tableView selectRowAtIndexPath:indexPath animated:YES]; // select the relevant row in the table (assuming the table is self.tableView)
    [self performSegueWithIdentifier:@"personProfile" sender:self]; // perform the segue
}

f)请注意,您不应致电 tableView:didSelectRowAtIndexPath:。这是为了在用户选择行时调用tableView,而不是以编程方式选择行。请改用selectRowAtIndexPath:animated:

答案 2 :(得分:0)

这基本上是 Swift 3

的pbasdf回答

我直接调用 didSelectRowAt ,因为它不是由 selectRowAtIndexPath

触发的

使用索引路径行

在创建单元格时设置标记

getTableView 功能是我自己的

@IBAction func actionButtonPushed(_ sender: Any) {
    guard let button = sender as? UIButton else { return }
    guard let tableView = getTableView() else { return }
    let indexPath = IndexPath(row: button.tag, section: 0)
    tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    if let delegate = tableView.delegate {
      delegate.tableView!(tableView, didSelectRowAt: indexPath)
    }
}