Возможно ли открытие экрана с помощью раскадровки?
Я играю с новыми функциями iOS 5 и пытаюсь переписать одно из своих приложений в качестве чистого приложения для iOS 5, используя новую функцию раскадровки.
Чтобы сократить длинную историю, у меня есть начальный экран, где приложение пытается подключиться к серверу, если пользователь сохранил некоторые данные для входа, если нет, он должен их попросить.
Вот как я это сделаю. Я создаю Viewcontroller, который выполняет соединение в методе viewDidLoad. Если нет данных для входа в систему или логин не увенчался успехом, мне нужно выполнить ручной переход на экран входа в систему.
Теперь это возможно, или мне нужны 2 доски для истории?
Ответы
Ответ 1
Я решил это, разместив логин без каких-либо segues (от или от него), как на скриншоте ниже:
![enter image description here]()
Затем я использовал пользовательский класс в контроллере панели вкладок, чтобы показывать его, когда мне это нужно.
В классе контроллера панели вкладок я использую 'viewDidLoad' для запуска просмотра входа. Чтобы показать модальное представление, у меня есть одноэлементный предмет, который хранит некоторое состояние, скажем, BOOL isAuthenticated, где я делаю магию:
- (void) performLoginIfRequired: (UIViewController *) source {
if (!self.isAuthenticated) {
NSLog(@"Is not authed");
UIStoryboard *storyboard = [UIApplication sharedApplication].delegate.window.rootViewController.storyboard;
UIViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"loginScreen"];
[source presentModalViewController:loginController animated:YES];
} else {
NSLog(@"Is authe");
}
}
И, в моем случае, я хотел, чтобы он показывался, когда приложение запускается первым, но также когда оно снова появляется на переднем плане. Итак, я зарегистрировал мой контроллер панели вкладок с центром уведомлений, поэтому я получаю уведомление, если приложение возвращается:
-(void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
}
В методе willEnterForeground я:
-(void) willEnterForeground: (NSNotification *)notification {
[[myStateThingy defaultState] performLoginIfRequired:self];
}
Ответ 2
Похоже, вам нужно использовать метод performSegueWithIdentifier. Убедитесь, что оба представления находятся в одной и той же раскадровке, соедините их вместе с помощью кнопки Push segue и дайте это имя. Затем, с первого кода контроллера, просто вызовите performSegueWithIdentifier, чтобы выполнить ручной отступ.
Надеюсь, это поможет!
См. также: Условно следуя segue
Cheers,
Джесси Л. Замора
Ответ 3
У меня была эта же проблема, и я решил это просто, выполнив следующее: вместо того, чтобы пытаться перейти на экран входа (модально или нажать), я сделал экран входа в систему моим контроллером корневого представления. В методе диспетчера входа в систему viewWillAppear
я проверяю, зарегистрирован ли пользователь уже. Если это так, я нажимаю свой домашний экран:
// mutableFetchResults is an array with my persistent Credentials object
if ([mutableFetchResults count] > 0) { // Someone already logged in
[self performSegueWithIdentifier:@"Home" sender:self];
}
Кроме того, в методе управления viewWillAppear
на экране главного экрана я спрятал кнопку обратной связи с этой строкой, чтобы пользователь не мог вернуться к экрану входа в систему:
self.navigationItem.hidesBackButton = YES;
Наконец, на каждой странице моего приложения есть кнопка "Выйти" в правом верхнем углу. Выйти и поставить экран входа в систему было так просто:
- (IBAction)signOutButtonPressed:(UIBarButtonItem *)sender {
MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate signOutCurrentUser]; // this method in my app delegate deletes the current Credentials
[self.navigationController popToRootViewControllerAnimated:YES];
}
Надеюсь, это было достаточно просто!
Ответ 4
Попробовав много разных методов, я смог решить эту проблему следующим образом:
-(void)viewWillAppear:(BOOL)animated {
// Check if user is already logged in
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if ([[prefs objectForKey:@"log"] intValue] == 1) {
self.view.hidden = YES;
}
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// Check if user is already logged in
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if ([[prefs objectForKey:@"log"] intValue] == 1) {
[self performSegueWithIdentifier:@"homeSeg3" sender:self];
}
}
-(void)viewDidUnload {
self.view.hidden = NO;
}