Реализация приложения DropBox для iPhone - переворачивание панели вкладок для отображения экрана входа в систему

Я пишу приложение, в котором вам нужно отображать экран входа в систему модально, а в приложении есть панель вкладок.

Я добавил панель вкладок прямо в UIWindow. Чтобы переключить его в новое представление (представление входа в систему), я переопределил applicationDidFinishLaunching, где я проверяю, есть ли у пользователя учетные данные для входа, в противном случае я не показываю экран входа в систему (при условии первого использования или выхода из системы) я модально представляю экран входа в систему. Я дал возможность выйти из системы на вкладке настроек внутри приложения.

Я использую вызов [[UIApplication sharedApplication] delegate], чтобы получить экземпляр делегата приложения, когда пользователь входит в систему в первый раз. Таким образом я получаю доступ к tabBarController, который является частью делегата приложения (как и в большинстве случаев). Однако, когда я пытаюсь вызвать свой loginViewController из параметра выхода в настройках (где-то в будущем жизненном цикле), тот же вызов [[UIApplication sharedApplication] delegate] возвращает мне делегат, для которого я не могу использовать ни один из методов, которые я использую. определили. Это дает мне ошибку «неопознанный селектор отправлен в экземпляр» во время выполнения.

Мне нужно понять, что именно возвращает делегат вызова [[UIApplication sharedApplication] delegate]? Изменяется ли объект делегата, который он возвращает, за период жизненного цикла приложения? ИЛИ это одиночный экземпляр на протяжении всего жизненного цикла приложения?

И, во-вторых, чтобы решить эту проблему, следует ли мне добавить tabBar в представление (содержащееся в главном окне) вместо того, чтобы добавлять его непосредственно в UIWindow (как это сделано в шаблоне для приложения Tab Bar и, по-видимому, является стандартной практикой). Есть ли какие-либо известные проблемы с этим подходом ИЛИ это нормально. Кто-нибудь пробовал это? Пожалуйста, дай мне знать.

Спасибо, Дев.


person Dev    schedule 16.08.2010    source источник


Ответы (1)


Похоже, ваш класс, который получает экземпляр вашего одноэлементного делегата, не знает, что он реализует. убедитесь, что вы #import передаете своего делегата классу, который использует его как [[UIApplication sharedApplication] delegate]. Кроме того, если вы получили предупреждение о несоответствии UIApplication или о чем-то еще, вы можете передать его своему типу AppDelegate, чтобы этого избежать.

Чтобы ответить на ваш вопрос о том, что возвращает этот вызов, это синглтон на протяжении всего жизненного цикла приложения.

Чтобы ответить на второй вопрос, наличие его в UIWindow (и, следовательно, в appdelegate) нормально и, вероятно, поощряется, поскольку это корневой контроллер вашего приложения (судя по звуку вещей)

person Jesse Naugher    schedule 16.08.2010
comment
Спасибо, Джесси ... это была одна из тех вещей, когда у тебя были мозги, и когда ты возвращаешься и смотришь на это на следующее утро, это то глупое заявление [выпуск appDelegate] ... благодаря чрезмерно хорошей памяти :). ... извините, что потратил ваше время, но если это поможет, ваша убежденность в том, что он действительно возвращает один и тот же объект singleton, заставила меня снова пройти через отладчик с другой точки зрения, и именно тогда я это заметил :) ... Также наличие tabBarController в UIWindow посчитал правильный способ сделать это, и я рад, что он сработал без каких-либо взломов или компрометации дизайна :) - person Dev; 17.08.2010