Другое странное поведение с UIPickerView selectedRowInComponent в iOS5 - PullRequest
2 голосов
/ 23 октября 2011

У меня странная вещь, которая происходит сейчас с моим приложением после обновления iOS 5.

У меня есть UIPickerView и я использую [customPickerView selectedRowInComponent:0], чтобы получить выбранный компонент.Пользователь выбирает вторую строку (с индексом 1)

Так это выглядит так:

i = [customPickerView selectedRowInComponent:0];   // -> i is 1 here, is OK!
[smsAgent  sendSMS:smsTxt]; //just call another method to send a SMS

При проверке значение i в порядке.Теперь я просто вызываю обычный SMS-диалог smsAgent, который выглядит по существу так:

smsAgent...
      MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
      picker.messageComposeDelegate = delegate;
      picker.recipients =[NSArray arrayWithObject: myTelNumber];  
      [delegate presentModalViewController:picker animated:YES];

определенно ничего не делает для моего сборщика.

Но когда это "возвращается" в

    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
        [self dismissModalViewControllerAnimated:NO]; //take away the SMS screen fast, so we can send selectModeVCDidFinish to take away ourselves
        int j = [customPickerView selectedRowInComponent:0];
        [self.delegate selectModeVCDidFinish: selectedMode];
}

значение j снова равно 0, а не 1 !

Конечно, ничего не происходит с customPickerView - я действительно озадачен - что здесь происходит?

До обновления до iOS5 не было никаких проблем.

Есть что-то, что я пропустил?

Большое спасибо

Ответы [ 2 ]

1 голос
/ 09 августа 2012

Спасибо за подробное объяснение проблемы.У меня была проблема с моими UIPickerViews.Как уже упоминалось в моем комментарии выше, мой код был основан на CustomPickerView - http://iphonedevelopment.blogspot.co.uk/2009/02/longer-spinning-blurring-v20.html

Этот код распался на версии 5.0.Проведя много исследований, я обнаружил, что проблема заключается не в последовательности / порядке вызова функций делегата для UIPicker.

Но неофициальная функция "scrollAnimationDuration", в частности, устарела и недоступна для использования.,Это и стало причиной того, что UIPicker не прокручивался на более длительный срок (как это было для iOS 4.3.3 и ниже).

0 голосов
/ 03 августа 2012

Как я написал в своем комментарии, причина такого поведения - порядок, в котором вызываются методы.Позвольте мне объяснить подробно:

Экран запуска начального экрана имеет обычные методы viewWillAppear и viewDidAppear.В этих сообщениях средство выбора создается (или любой другой элемент) и ему присваивается значение, которое предоставляется базовыми структурами данных.Итак, скажем, сборщик получает 10.

Теперь при выборе другого значения 20, которое помещается в переменную, и я подумал, что это будет СОХРАНИТЬ.

Теперь открывается диалоговое окно SMS и отправляется смс.

Но то, что происходит сейчас, является причиной этой странной проблемы.Когда диалоговое окно SMS исчезает, screenVC запускает viewWillAppear, это устанавливает для переменной BACK значение 10 (поскольку структуры данных еще не были обновлены)

Теперь смс возвращается в didFinishWithResult, и лежащие в основе 20 теряются.

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

Просто дополнительная проблема.Еще более удивительно, если screenVC открывает другой screen2VC, который имеет только средство выбора (и устанавливает значение 10), а этот затем открывает диалоговое окно смс.Когда диалог sms возвращается, он заставляет screen2VC вызывать viewWillAppear и viewDidAppear, даже если они были отклонены.

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

Надеюсь, я мог бы объяснить достаточно хорошо, чтобы понять - просто спросите, не ясно ли это.

И в качестве последнего комментария: вставьте операторы отладки в код, где назначается ваша переменная - там вы можете видеть, что assignemnt вызывается, даже если вы не ожидали / не подумали об этом.

...