Как найти indexPath для нажатой кнопки аксессуаров в tableView
У меня есть простой UITableView
с одним разделом и несколькими строками. Когда пользователь нажимает кнопку сотового аксессуара (которая связана с detailsSegue
), я хочу знать, что это за ячейка. Поэтому, чтобы выбрать правильный объект из моего массива и назначить его переменной из следующего представления.
Я использовал метод delegate tableview:accessoryButtonTappedForRowWithIndexPath:
и присвоил значение indexPath моей частной собственности myRow
. Вместо метода prepareForSegue:sender:
я использовал значение self.myRow.row
для выбора правильного объекта из массива.
Моя проблема в том, что эти два метода, похоже, выполняются в неправильном порядке. Из NSLog я вижу, что метод prepareForSegue:sender:
выполняется первым, и мой метод делегата меняет значение self.myRow
после него.
Так что prepareForSegue:sender:
метод всегда передает неправильный объект в следующий вид (тот, который был использован ранее).
Извините за моих английских парней. Благодарим вас за помощь.
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
self.myRow = indexPath;
NSLog(@"tapped button at row: %i",self.myRow.row);
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"addSegue"]) {
AddViewController *avc = segue.destinationViewController;
avc.delegate = self;
}
else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
NSLog(@"Segue row: %i",self.myRow.row);
Annotation *annotation = [self.viewsList objectAtIndex:self.myRow.row];
NSLog(@"Segue annotation object: %@",annotation.title);
DetailsViewController *dvc = segue.destinationViewController;
dvc.wikiKey = annotation.title;
}
}
Ответы
Ответ 1
Как вы обнаружили, система отправляет вам сообщение prepareForSegue:sender:
, прежде чем отправит вам сообщение tableview:accessoryButtonTappedForRowWithIndexPath:
.
Но, когда он отправляет вам сообщение prepareForSegue:sender:
, аргумент sender
представляет собой UITableViewCell
, содержащий аксессуар. Вы можете использовать это, чтобы определить, какая кнопка аксессуара строки была нажата:
else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
Annotation *annotation = [self.viewsList objectAtIndex:indexPath.row];
DetailsViewController *dvc = segue.destinationViewController;
dvc.wikiKey = annotation.title;
}
Ответ 2
Отправитель будет кнопкой аксессуара, верно? В этом случае вы сможете найти свою содержащую ячейку, перейдя через супер-представления, а затем получите индексный указатель этой ячейки. Ive использовал метод, подобный этому, прежде чем сделать первую часть:
+ (UITableViewCell *)findParentCellOfView:(UIView *)view {
if (view == nil || [view isKindOfClass:[UITableViewCell class]]) {
return (UITableViewCell *)view;
}
return [self findParentCellOfView:[view superview]];
}
Ответ 3
//Я говорю вам простой и лучший и простой вариант: -
//Решение. - Вы можете назначить тег кнопке вспомогательного вида в этом методе tableView
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// set accessory view
UIButton *oValidHomeAccessryBtn = [UIButton buttonWithType:UIButtonTypeCustom];
// set target of accessory view button
[oValidHomeAccessryBtn addTarget:self action:@selector(AccessoryAction:) forControlEvents:UIControlEventTouchUpInside];
// set tag of accessory view button to the row of table
oValidHomeAccessryBtn.tag =indexPath.row;
// set button to accessory view
cell.accessoryView = oValidHomeAccessryBtn ;
}
//Создайте метод, который вы передали в селекторе, и получите значение тега, и вы получите щелчок по индексу indexPath для аксессуаров
- (void)AccessoryAction:(id)sender
{
NSLog(@"%d",[sender tag]);
}
Это самый простой способ получить indexPat строки, в которой вы нажали вспомогательный вид.
Ответ 4
Что вам нужно сделать, это вызвать программный код segue
из метода делегата. Предполагая, что вы используете раскадровки, вам нужно отключить segue
в раскадровке, а в методе делегата:
[self performSegueWithIdentifier: @"IdentifierNameHere" sender: self];