«Indexpath» не выделил (сначала используется в этой функции)
-
28-10-2019 - |
Вопрос
У меня есть следующая ошибка. «Indexpath» не выделил (сначала используется в этой функции).
Код. didselectrowatindexpath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge];
cell.accessoryView = spinner;
[spinner startAnimating];
[spinner release];
[self performSelector:@selector(pushDetailView:) withObject:tableView afterDelay:0.1];
}
pushdetailView
- (void)pushDetailView:(UITableView *)tableView {
// Push the detail view here
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//load the clicked cell.
DetailsImageCell *cell = (DetailsImageCell *)[tableView cellForRowAtIndexPath:indexPath];
//init the controller.
AlertsDetailsView *controller = nil;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
controller = [[AlertsDetailsView alloc] initWithNibName:@"DetailsView_iPad" bundle:nil];
} else {
controller = [[AlertsDetailsView alloc] initWithNibName:@"DetailsView" bundle:nil];
}
//set the ID and call JSON in the controller.
[controller setID:[cell getID]];
//show the view.
[self.navigationController pushViewController:controller animated:YES];
}
Я думаю, это потому, что я не анализирую значение indexpath от didSelectRowAtIndexPath
к pushDetailView
Но я не знаю, как приблизиться к этому.
Кто -нибудь может посоветовать?
Спасибо.
Решение
Проблема в том, что вы pushDetailView:
Метод не имеет indexPath
переменная на сфере масштаба.
Вместо
- (void)pushDetailView:(UITableView *)tableView {
Вы должны сделать свой метод таким:
- (void)pushDetailView:(UITableView *)tableView andIndexPath: (NSIndexPath*) indexPath {
а потом indexPath
будет объявлено в области метода.
Затем внутри вашего didSelectRowAtIndexPath
Метод, заменить
[self performSelector:@selector(pushDetailView:) withObject:tableView afterDelay:0.1];
Для кода реже:
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self pushDetailView: tableView andIndexPath: indexPath];
});
Это использует GCD
выполнить код после задержки, вместо performSelector: withObject :afterDelay:
И вот есть Хороший пост Объясняя, почему иногда лучше выбрать этот арест
Другие советы
Поскольку вам нужно предоставить два аргумента и выполнить после пакета задержки оба аргумента в NSDictionary и передать его:
NSDictionary *arguments = [NSDictionary dictionaryWithObjectsAndKeys:
tableView, @"tableView", indexPath, @"indexPath", nil];
[self performSelector:@selector(pushDetailView:) withObject:arguments afterDelay:0.1];
...
- (void)pushDetailView:(NSDictionary *)arguments {
UITableView *tableView = [arguments objectForKey:@"tableView"];
NSIndexPath *indexPath = [arguments objectForKey:@"indexPath"];
...
Или как предполагает @felipe, используйте GCD.