задержка скрытия навигационной кнопки правой панели - PullRequest
0 голосов
/ 27 мая 2011

У меня есть UITableview с панелью навигации вверху.У меня есть кнопка обновления как rightBarButtonItem.

Когда нажата кнопка обновления, я хочу скрыть кнопку обновления, перезагрузить таблицу и отобразить представление оповещения.

-(void)refreshClicked{
    self.navigationItem.rightBarButtonItem=nil;
    app.networkActivityIndicatorVisible = YES;
    [appDelegate readJSONData];
    [self.tableView reloadData];
    UIAlertView *infoAlert = [[UIAlertView alloc] initWithTitle:@"" message:@"Kampanjerna är nu uppdaterade" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [infoAlert show];
    [infoAlert release];
}   

Я обнаружил, что когда мой сигнал Wi-Fi становится слабее, кнопка обновления не скрывается сразу и возникает задержка.Боюсь, что при использовании 3G будут дальнейшие задержки, и пользователь может снова нажать кнопку обновления, думая, что в первый раз она не была нажата.

Есть ли проблемы со мной, код?

Помощь будет оценена

РЕДАКТИРОВАТЬ -----------

-(void)refreshClicked{
    self.navigationItem.rightBarButtonItem=nil;
    app.networkActivityIndicatorVisible = YES;

    // do data processing in the background
    [self performSelectorInBackground:@selector(doBackgroundProcessing) withObject:self];

    UIAlertView *infoAlert = [[UIAlertView alloc] initWithTitle:@"" message:@"Kampanjerna är nu uppdaterade" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [infoAlert show];
    [infoAlert release];
}


- (void)doBackgroundProcessing {
    NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; 
    [appDelegate readJSONData]; 

    // must update the UI from the main thread only; equivalent to [self.tableView reloadData]; 
    [self performSelectorOnMainThread:@selector(reloadData) withObject:self.tableView waitUntilDone:NO];

    [pool release];
}

Ошибка

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[campaignTableViewController reloadData]: unrecognized selector sent to instance 0x703eba0'

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

Почему бы не отключить кнопку обновления вместо этого, это намного проще, и лично я бы предположил, что пользователь будет ожидать.это парадигма, используемая в многочисленных программных приложениях.если я касаюсь кнопки, действительно ли я хочу, чтобы она исчезла, почему она исчезла, она сломана?если он отключен, и пользователь может видеть, что что-то происходит (индикатор активности, окно предупреждения - может быть, перебор?), он будет более уверен, что ваше приложение ведет себя предсказуемым и надежным образом

myButton.isEnabled = NO;

// установить индикатор активности, пока вы занимаетесь

// позже, когда закончите

myButton.isEnabled = YES;
0 голосов
/ 27 мая 2011

По сути, хотя вы и не ноль rightBarButtonItem, это изменение не будет отражено в пользовательском интерфейсе, пока элемент управления не вернется в основной цикл выполнения приложения.Так что, если остальная часть вашего метода занимает некоторое заметное время (как это было бы с сетевыми запросами), вы не увидите, как кнопка исчезнет, ​​пока эта работа не будет завершена.

Более конкретно: вы блокируете основной поток;чтобы исправить это, вам нужно выполнить трудоемкую работу в фоновом потоке.

Что-то подобное должно работать (ни скомпилировано, ни протестировано):

-(void)refreshClicked{
    self.navigationItem.rightBarButtonItem=nil;
    app.networkActivityIndicatorVisible = YES;

    // do data processing in the background
    [self performSelectorInBackground:@selector(doBackgroundProcessing) withObject:self];

    // go ahead and show the alert immediately
    UIAlertView *infoAlert = [[UIAlertView alloc] initWithTitle:@"" message:@"Kampanjerna är nu uppdaterade" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [infoAlert show];
    [infoAlert release];
}   

- (void)doBackgroundProcessing {
    [appDelegate readJSONData];

    // must update the UI from the main thread only; equivalent to [self.tableView reloadData];
    [self performSelectorOnMainThread:@selector(reloadData) withObject:self.tableView waitUntilDone:NO];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...