Код запуска, когда UIPickerView selectRow: inComponent: animated: YES завершен? - PullRequest
2 голосов
/ 16 августа 2011

Мой метод действия:

- (IBAction)buttonPressed {
    // animate picker to random row (picker is a UIPickerView)
    int row = random() % [self.column1 count];  
    [picker selectRow:row inComponent:0 animated:YES];  
    [picker reloadComponent:0];

    // display new selected row content
    int selectedRow = [picker selectedRowInComponent:0];
    NSString *selectedItem = [self.column1 objectAtIndex:selectedRow];
    myLabel.text = selectedItem;  // UILabel under the picker
}

Однако

    myLabel.text = selectedItem;

вызывается до завершения анимации, поэтому новое значение не отображается.

Я нашел поток Как получить обратный вызов из UIPickerView после завершения анимации selectRow? , но в ответе используется блок beginAnimations / commitAnimation - о котором Apple говорит: «Использование этого метода не рекомендуется в iOS 4.0 и более поздние версии. Вместо них следует использовать методы анимации на основе блоков. "

Как бы я использовал блочную анимацию для достижения этой цели?

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Похоже, Apple нужно обновить свой UIPickerView API для поддержки обработчика завершения на основе блоков. А пока подождите только приблизительное время анимации.

[picker selectRow:0 inComponent:0 animated:YES];  

[self performSelector:@selector(setMyLabel)  // setMyLabel - my function
           withObject:nil
           afterDelay:0.4];
0 голосов
/ 16 августа 2011

Вы пробовали что-то вроде этого:

[UIView animateWithDuration:2.0
                     delay:0.0
                   options:UIViewAnimationOptionCurveEaseInOut
                animations:^{
                   // the animation code
                   [myPickerView selectRow:0 inComponent:0 animated:YES];
                }
                completion:^(BOOL finished) {
                   [self performSelector:@selector(setMyLabel)];
                }
];

Или вы можете просто установить метку непосредственно в блоке завершения, если это единственное, что вы хотите сделать после завершения анимации.

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

Приведенный выше код такой же, как код в другой теме, которую вы упомянули, но вместо этого используются блоки анимации.Я фактически не знал, будет ли метод selectRow: inComponent: animated: работать в том же потоке анимационного блока или у него будет свой собственный поток.Так как он не работает, это означает, что он работает в своем собственном потоке, поэтому написанный мною код не будет работать.

Существует один способ решения этой проблемы: блокировка основного потока на времянеобходим для завершения анимации.Вы можете вызвать [NSThread sleepForTimeInterval: 1.0] после вашего вызова selectRow: inComponent: animated:, и вы можете настроить интервал, пока не достигнете подходящего значения.Обратите внимание, что блокирование основного потока крайне нежелательно для Apple.Лично я заблокировал бы это, только если бы я не мог придумать другой способ достигнуть того, что я пытаюсь сделать, и если время блокировки меньше, чем 1.

...