2013-07-10 6 views
2

Я создаю приложение iOS, в котором у меня есть следующее требование: приложение должно отображать экран входа в систему при первом запуске, а также этот экран также должен отображаться, когда приложение поставляется с фона на передний план, если оно было отправлено на фоновое изображение во время выполнения.Как вызвать контроллер вида из AppDelegate в iOS

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

Я называю экран будет отображаться, если приложение поставляется из фона, как это, в applicationWillEnterForeground, в AppDelegate:

self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
RoomRootViewController* room = [[RoomRootViewController alloc] init]; 
[[self window] setRootViewController:room]; 
[self.window makeKeyAndVisible]; 

Является ли это правильный способ сделать это?

Большое спасибо! Я полностью потерял это, поскольку я очень новичок в iOS, поэтому любая помощь будет очень оценена.

На картинке вы можете увидеть, где приложение не работает. Screenshot of the thread where the app fails

Screenshot of the tracking made to interpret the thread issue

+1

Что бы я делал в этом случае, это использовать экземпляр контроллера навигации в вашем делете приложения и представить свой логин-контроллер по-разному. Если вы не используете иерархию контроллера навигации, я бы порекомендовал ее, но другой вариант должен был просто добавить ваше представление диспетчера просмотров в качестве подзаголовка вашего uiwindow. Я думаю, что ваша проблема может быть связана с созданием нового экземпляра приложений uiwindow. Вам не нужно будет удалять окно делегатов приложений после его создания. –

ответ

8

код вы используете полностью удалить корневой контроллер представления вашего окна приложения, другими словами, вы удаляете все мнения и просматривать контроллеры в приложении. Если вы не используете ARC, это всего лишь одна огромная утечка памяти. Если да, то это еще не очень хорошая идея.

В вашем методе applicationWillEnterForeground:, попробуйте использовать этот код вместо:

RoomRootViewController* room = [[RoomRootViewController alloc] init]; 
[self.window.rootViewController presentViewController:room 
              animated:NO 
              completion:nil]; 

Это покажет RoomRootViewControllerнад верхней всех современных представлений вашего приложения, а не удалять их. Затем вы можете уволить его следующим образом:

[self.window.rootViewController dismissViewControllerAnimated:YES 
                completion:nil]; 

и легко вернуться к остальной части приложения.

+0

Это работает как шарм! Большое спасибо !Вы не представляете, насколько я благодарен. Ты жжешь ! –

+0

не работает для меня .... я не знаю, что я пропустил –

0

Это будет очень грязно, если вы используете эту строку кода

self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

Это означает, что каждый раз, когда вы создаете новый экземпляр UIWindow, который будет содержать UIViewController и всю остальной компоненту каждый раз. Это означает, что когда вы переходите на задний план и выходите на передний план, старый экземпляр окна сбрасывается, и он будет содержать новые компоненты, поэтому, когда вы нажимаете на UITextField, он был освобожден. Причина, по которой вы получаете ошибку. Не создавайте новый экземпляр окна и используйте код как @PartialFinite.

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^