Как получить обратный вызов из UIPickerView после завершения анимации selectRow? - PullRequest
2 голосов
/ 01 апреля 2009

У меня есть UIPickerView, и я хотел бы получать уведомления, когда анимация selectRow завершена.

Я попробовал следующий подход в моем контроллере представления, который имеет ссылку на UIPickerView, и он не будет работать:

-(void)viewDidLoad
{
    ...
    [UIPickerView setAnimationDelegate:self];
    [UIPickerView setAnimationDidStopSelector:@selector(animationFin ished:finished:context];
    ...
}

- (void)animationFinishedNSString *)animationID finishedBOOL)finished contextvoid *)context
{
    if (finished) {

    }

}

Затем где-то в моем коде я запускаю анимацию:

[picker selectRow:random() % pickerDataCount inComponent:0 animated:YES];

Ответы [ 3 ]

2 голосов
/ 17 апреля 2009

вам нужно вложить вызов метода в блок beginAnimations / commitAnimation.

- (void) animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context {
    NSLog(@"Here I am");
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{

    [UIView beginAnimations:@"1" context:nil]; // nil = dummy
    [UIPickerView setAnimationDelegate:self];
    [UIPickerView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
    [myPickerView selectRow:0 inComponent:0 animated:YES]; // jump with any swipe in picker always to row=0 as dummy to initiate animation
    [UIView commitAnimations];

    //...whatever comes in addition...
}
1 голос
/ 26 июля 2017

Я решил это с помощью смеси различных Ответов, упомянутых здесь. Поведение будет состоять в том, что он будет ожидать завершения прокрутки и затем сохранит выбранное значение.

  1. Создайте две переменные, в которых будут храниться состояние прокрутки и состояние сохранения. В didSet вы проверите, была ли нажата кнопка сохранения во время прокрутки. Если да, позвоните сохранить после того, как сборщик завершил прокрутку.

    var shouldSave = false
    var pickerViewIsScrolling = false {
        didSet {
            if !pickerViewIsScrolling && shouldSave {
                save()
            }
        }
    }
    
  2. Чтобы распознать, прокручивается ли сборщик, добавьте pickerViewIsScrolling = true в метод выбора viewForRow.

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        pickerViewIsScrolling = true
        ...
    }
    
  3. Чтобы распознать, остановился ли сборщик, добавьте pickerViewIsScrolling = false к didSelectRow сборщика.

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
         pickerViewIsScrolling = false 
         ...
    }
    
  4. В вашей функции save() добавьте следующее, чтобы проверить, прокручивает ли сборщик (и сохраняет ли он после остановки) или не прокручивает и сохраняет непосредственно.

    func save() {
         if(pickerViewIsScrolling){
              shouldSave = true
              return
         }
    
         // Save the Data...
    
    }
    
  5. И, наконец, добавьте к вашей функции viewDidAppear эту строку, чтобы перехватить pickerViewIsScrolling = true исходных сгенерированных представлений.

    override func viewDidAppear(_ animated: Bool) {
    
         super.viewDidAppear(animated)
    
         pickerViewIsScrolling = false
    
         ...
    
    }
    

Это прекрасно работает для меня. Я также реализовал деактивацию кнопки, пока нажата кнопка сохранения, и она ожидает завершения прокрутки. Таким образом, пользователь не будет смущен, почему ничего не происходит, пока прокрутка не остановится.

1 голос
/ 24 сентября 2009

вы можете опубликовать уведомление для себя от viewForRow когда он запрашивает представление для интересующего компонента и строки.

Вам просто нужно держать строку и компонент как свойства и установите их перед вызовом selectRow. И, по мнению ForRow

if ((component == [self component] && (row == [self row]) опубликовать уведомление для себя

...