UItableViewCell配件按钮出现问题。 我的配件按钮与另一个UIViewController的segue“连接”。 当我点击一个附件按钮时,我从模型中获取对象,并将此对象“传递”到segue destinationViewController。 这是我对segue方法的准备:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"IdentityCard"])
{
NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row);
[segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.tableView.indexPathForSelectedRow.row]];
}
}
问题是方法开头的NSLog(在“if”之后)始终显示数字0! 我试图实现这个方法:
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
但是在此方法之前执行了segue方法的准备,因此我无法为“保存”indexPath设置任何@property。 我该如何解决这个问题?
答案 0 :(得分:20)
在:
- (void)prepareForSegue:(UIStoryboardSegue *)segue发件人:(id)发件人
...您有'sender'参数,可以让您知道已经过Tap的配件的Cell,所以:
index = [self.tableView indexPathForCell:sender] .row;
您可以获取它的索引以便使用它。
然后你不需要使用tableView的accessoryButtonTappedForRowWithIndexPath方法。
答案 1 :(得分:1)
我以这种方式修复问题: 我将UIViewController连接到destinationViewController(不是来自UIViewController的附件按钮)。
我在第一个View Controller中创建了一个@property:
@property (nonatomic) NSInteger indexPathRow;
然后我修改了这样的代码:
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Disclosure Tapped----> %i" ,indexPath.row);
self.indexPathRow = indexPath.row;
[self performSegueWithIdentifier:@"IdentityCard" sender:self];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"IdentityCard"])
{
NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row);
[segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.indexPathRow]];
}
}
现在有效!
答案 2 :(得分:0)
@Andres的解决方案对我有用但是如果我想将Add按钮添加到导航栏并且我想要显示具有相同segue标识符的相同viewcontroller,那么index = [self.tableView indexPathForCell:sender].row;
代码不起作用,因为发送者不是UITableViewCell的子类。
所以这是我使用@Andres代码的解决方案:
- (void) addItem: (id) sender {
[self performSegueWithIdentifier: @"Identifier" sender: self];
}
- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender {
id selectedObject;
if (![[sender class] isSubclassOfClass: [UITableViewCell class]]) {
// create a new object
selectedObject = [...];
}
else {
selectedObject = [objectArray objectAtIndex: [self.tableView indexPathForCell: sender].row];
}
if ([[segue identifier] isEqualToString: @"Identifier"]) {
// use the new or existing object
[selectedObject doSonething];
}
}