Отображение одноразового UIViewController через presentModalViewController при запуске - PullRequest
0 голосов
/ 28 октября 2009

Привет! У меня есть работающее приложение для iPhone (huzzah!), Которое использует MainView.xib, содержащий полностью укомплектованный UITabBar с несколькими UINavigationController объектами и представлениями в готовом виде.

Теперь меня попросили добавить одноразовое представление регистрации к этому соединению. Это представление будет отображаться до UITabBar при запуске приложения, получать некоторую информацию от пользователя, регистрироваться на сервере - или проверять существующую регистрацию, а затем сжимать некоторые данные в Брелок. (Если цепочка для ключей уже показывает подтверждение регистрации, мы пропускаем показ этого конкретного представления.)

Часть регистрации и связки ключей у меня под контролем ( спасибо Эрике Садун за последнее! ), но показ того, что первоначальный одноразовый просмотр оказывается хитрее, чем я ожидал.

Я подозреваю, что слишком близко к проблеме, чтобы понять, в чем дело. Я действительно надеюсь, что это ошибка пилота и ничего не требует тоже Рубе Голдберг!

Вот сценарий:

Приложение запускается с загрузки MainView.xib , в котором находится вышеупомянутый контроллер UITabBar , et. и др. Ради аргумента, скажем, мы должны показать это представление регистрации. Кроме того, нам бы хотелось, чтобы он имел модальный вид, поэтому он будет летать снизу вверх. Затем, когда мы закончим, мы можем отклонить его, вызвать делегата (скорее всего, делегата приложения) и попросить его продолжить работу с оригинальным UITabBar .

// Normally, the Tab Bar Controller's view is added to the window ... still do this?
[window addSubview:tabBarController.view];

// We could now set up a VC like so. Mostly harmless. (I know, "mvc" is an unfortunate abbreviation in this case.)
RegistrationVC *mvc = [[RegistrationVC alloc] initWithNibName:@"RegistrationView" bundle:nil];

Обратите внимание, что RegistrationView.xib имеет UIView внутри, но не имеет контроллера навигации. Мы хотим, чтобы он был отделен, чтобы его можно было использовать, скажем, как часть навигационного контроллера элемента панели вкладок (например, для просмотра вашей регистрационной информации).

Двигаемся дальше. Мы создаем навигационный контроллер с целью модального представления вещей:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:mvc];

Затем мы представляем наш модальный VC, используя контроллер панели вкладок в качестве основы, и высвобождаем выделенные биты.

[tabBarController presentModalViewController:nc animated:YES];
[nc release];
[mvc release];

Первое наблюдение. Что-то говорит мне, что это просто небрежно. Вы можете видеть навигационную панель и панель первого элемента панели вкладок, появляющиеся точно так же, как модальный вид. Более того, попытка установить для выбранного VC значение nil заранее не имеет никакого эффекта:

 tabBarController.selectedViewController = nil;

Мы действительно не хотим / не должны использовать панель вкладок до после модального VC (и у нас есть делегат, который поможет сообщить нам, когда это произойдет).

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

Это единственный способ? Просто кажется, что он без необходимости привязывает регистрационный VC и панель вкладок, и пахнет ... неправильно.

Подсказки приветствуются / приветствуются!

1 Ответ

1 голос
/ 28 октября 2009

Трудно ответить на это, не зная, что показывает ваш Default.png. Предполагая, что вы следите за HIG, и он отображает пустой tabBarController, я бы предложил несколько более сложный уровень: вид снизу: tabBarController.view средний вид: UIImageView: Default.png вид сверху: вид регистрации, расположенный под нижней частью экрана

При запуске, если вам нужно показать представление регистрации, вручную анимируйте его вверх, и после завершения анимации удалите UIImageView под ним. Когда регистрация завершена, вручную анимируйте представление регистрации вниз, чтобы открыть tabBarController. Если при запуске вам не нужно представление регистрации, просто анимируйте UIImageView, чтобы исчезнуть (или просто удалите его).

С другой стороны, если вы не следите за HIG и вместо этого показываете какой-то экран-заставку, все становится немного проще. Слой, как это: вид снизу: tabBarController.view вид сверху: UIImageView: Default.png

Если вам нужно показать регистрацию, представьте ModalViewController с анимированным: НЕТ, а затем исчезните UIImageView. Если нет, просто исчезните UIImageView.

Это длинное объяснение без картинок, надеюсь, оно имеет смысл. Важным моментом является то, что я предлагаю добавить UIImageView: Default.png, чтобы быть первым, что видно при запуске приложения, и использовать это, чтобы направить ваш переход в регистрацию или tabBarController в зависимости от ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...