Как найти indexPath for tapped accessory button в tableView
у меня просто UITableView
С одним разделом и несколькими строками. Когда пользователь нажимает кнопку сотового аксессуара (которая связана с detailsSegue
. Я хочу знать, что это была за камера. Поэтому я могу выбрать правильный объект из моего массива и назначить его переменной из следующего представления.
я использовал метод делегата 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;
}
}
4 ответов
как вы обнаружили, система отправляет вам prepareForSegue:sender:
до он посылает вам tableview:accessoryButtonTappedForRowWithIndexPath:
сообщение.
но, когда он посылает вам prepareForSegue:sender:
сообщении
отправителем будет кнопка аксессуара, верно? В этом случае вы сможете найти его содержащую ячейку, пройдя через супер-представления, а затем получить путь индекса этой ячейки. Я использовал такой метод раньше, чтобы сделать первую часть:
+ (UITableViewCell *)findParentCellOfView:(UIView *)view {
if (view == nil || [view isKindOfClass:[UITableViewCell class]]) {
return (UITableViewCell *)view;
}
return [self findParentCellOfView:[view superview]];
}
/ / Я скажу вам простой и лучший и простой вариант : -
/ / решение : - вы можете назначить тег кнопке просмотра аксессуаров в этом методе 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 строки, в которой вы щелкнули представление аксессуаров.
что вам нужно сделать, это позвонить segue
программно из метода delegate. Предполагая, что вы используете раскадровки, вам нужно будет отключить segue
в раскадровке и в методе делегата используйте:
[self performSegueWithIdentifier: @"IdentifierNameHere" sender: self];