Я боролся с проблемой звука в UIPickerView, и хотя это только частично относится к исходному вопросу, я публикую здесь проблему / решение, потому что эта тема постоянно появляется в моих результатах поиска, так что я думаю, что кто-то еще в одной лодке тоже может оказаться здесь…
Мне нужно было инициализировать UIPickerView, чтобы восстановить выбранную строку из сохраненных данных. Просто, правда? В viewDidLoad просто вызовите selectRow: inComponent: анимированный метод UIPickerView:
[myPicker selectRow:currentRowIndex inComponent:0 animated:NO];
Это работает, как и ожидалось, но имеет побочный эффект: генерируется один звук «щелчка», как если бы пользователь прокручивал элемент управления. Звук щелчка появляется только при запуске на устройстве (не на симуляторе) и только в том случае, если на устройстве установлена iOS 3.x (я тестировал с 3.1.3 и 3.2). Это, очевидно, была ошибка в iOS, которая была исправлена начиная с iOS 4.0. Но если вам нужно нацелиться на iPhone Gen1, вы застряли с iOS 3.1.3, где эта проблема присутствует.
Я обсуждал эту проблему с Apple DTS, но они не смогли предложить какой-либо обходной путь, кроме обновления до 4.0. Я спросил, сделают ли они исключение и разрешат ли использование недокументированного набора setSoundsEnabled, упомянутого выше (который действительно решает проблему). Ответ был: «Нет никаких исключений».
После некоторой дополнительной детективной работы я обнаружил, что вы можете предотвратить появление звука, временно удалив UIPickerView из суперпредставления, вызовите selectRow, а затем снова добавьте его в суперпредставление. Например, в viewDidLoad:
UIView *superview = [myPicker superview];
[myPicker removeFromSuperview];
[myPicker reloadAllComponents];
[myPicker selectRow:currentRowIndex inComponent:0 animated:NO];
[superview addSubview:myPicker];
Это избавляет от постороннего звука щелчка без использования недокументированных / частных API, поэтому должно пройти процедуру одобрения Apple.