如何使用UITableViewController按钮实现自定义单元格选择行为?

时间:2011-09-28 07:59:31

标签: iphone objective-c uibutton uitableview

我正在尝试用按钮按下行为替换标准表格单元格选择行为。结果应该相同 - 将detailViewController推到顶部并显示一些详细信息。单元视图从单独的xib文件加载。因此,我需要在该单元格xib中放置一个按钮,并使用该按钮打开表VC中的详细信息VC。我已经在单元格xib中放置了按钮视图,并在表VC viewDidLoad中禁用了单元格选择,但是现在,我不知道如何处理按钮按下,按钮按下代码的位置或使用什么委托方法因为{{ 1}}没有重新编码(因为我禁用了它)。有什么建议?

更新:我需要在按下按钮时从单元格(部分,索引)获取一些信息,以便初始化详细信息VC的数据。此外,请注意,每个单元格中将有几个按钮。

UPDATE2:我正在使用带有部分的行,所以在按下按钮时我需要传递与按下按钮的单元格对应的部分和行号。

UPDATE3:我曾尝试使用唯一标签来识别单元格,但看起来它不是解决方案,因为我遇到了重复使用单元格的问题。创建前9行,并为它们设置相关的标签号。但是然后从队列中重新使用10中的每一行,所以我用它们的标签得到相同的9视图。例如,第10行弹出队列中第一行按钮,标签为1,11-第二行按钮,标签为2,依此类推。我的意思是,整个出队单元意味着表中有多少行并不重要,将为所有表行重用9个单元格视图。这意味着我无法为单元格分配唯一标记,因为单元格视图对于每一行都不是唯一的

2 个答案:

答案 0 :(得分:1)

如果我对你提出问题,那么这将是解决方案

[cell.yourButton addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside];
//you can use tag property of button
    NSUInteger tag=indexPath.row+1;
    cell.yourButton.tag=tag;

此代码应该在

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

&安培;你写行动

-(IBAction)myAction:(id)sender{
     UIButton *but=(UIButton *)sender;
     NSLog(@"Tag-%d",but.tag);
     NSUInteger index=but.tag-1;  
  //using tag you will come to know which button is pressed ...

}

答案 1 :(得分:1)

由于UPDATE3中描述的原因,带有标签的建议没有解决。但是,我通过调用“magic”indexPathForRowAtPoint:方法成功了。所以解决方案是:

1)在cellForRowAtIndexPath中附加按钮的自定义方法:

// I have already created/loaded and got a handler to my button btn 
// here comes attaching
[btn addTarget:self action:@selector(openDetailViewController:event:) forControlEvents:UIControlEventTouchUpInside];

2)定义自定义方法:

-(void)openDetailViewController:(id)sender event:(UIEvent *)event{

  NSSet *touches = [event allTouches];
  UITouch *touch = [touches anyObject];
  CGPoint currentTouchPosition = [touch locationInView:self.tableView];
  NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:currentTouchPosition];
  // do my stuff
}

因此,当按下按钮时,我的方法被调用,传递一些额外的参数,比如event。通过调用“allTouches”和“anyObject”,我正在接触。然后,我从那个触摸中检索CGPoint,然后将该点传递给“indexPathForRowAtPoint”,返回带有section和row number的所需indexPath。酷:)