Подтвердить что ты не робот

Возможно ли открытие экрана с помощью раскадровки?

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

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

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

Теперь это возможно, или мне нужны 2 доски для истории?

4b9b3361

Ответ 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;
}