indexPath необъявленный (первое использование в этой функции) - PullRequest
0 голосов
/ 15 июня 2011

У меня следующая ошибка. 'indexPath' undeclared (первое использование в этой функции) .

Код . 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, но я не знаю, как к этому подойти.

Может кто-нибудь, пожалуйста, посоветовать?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Проблема в том, что у вашего 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:, а вот хороший пост , объясняющий, почему иногда лучше выбрать этот подход

0 голосов
/ 15 июня 2011

Поскольку вам нужно предоставить два аргумента и выполнить после задержки пакет обоих аргументов в 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.

...