viewController появляется черный при появлении - PullRequest
7 голосов
/ 04 ноября 2011

Привет. Все, я новичок в разработке для iOS, и в настоящее время у меня возникла проблема с чем-то, я пытаюсь сделать так, чтобы форма входа отображалась модально, если пользователь не вошел в систему.

Я используюNSUserDefaults для хранения идентификатора, который я просто проверяю, существует ли он.Если этого не произойдет, я бы хотел, чтобы UIViewController появился.

Пока у меня есть следующий код в моем UINavigationController, который находится внутри UITabViewController, я пытаюсь заставить UIViewController появляться над первым UINavigationController (выбранный), в данный момент происходит анимация, но есть только черный экран, хотя на экране входа в систему уже созданы все соответствующие текстовые поля и т. д.Если я устанавливаю этот экран входа в качестве начального представления для загрузки, он нормально загружается.

Это код, который появляется в первом контроллере представления UINavigationController.

 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if (![prefs stringForKey:@"id"]){
    LoginViewController *loginController = [[LoginViewController alloc] init];
    [self presentModalViewController:loginController animated:YES];
} else {
    [self loadCoffeeUserOrders:[prefs stringForKey:@"id"]];  
}

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

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

спасибо

Ответы [ 3 ]

7 голосов
/ 05 ноября 2011

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

Самый простой способ - создать переход в раскадровке от вашего первого контроллера представления до контроллера представления входа в систему, который вы там создали. Вы можете с помощью Ctrl перетащить один контроллер вида на другой и выбрать «Модальный» в качестве типа перехода. Затем перейдите к инспектору для этой передачи и дайте ему идентификатор. Допустим, вы называете это "segueToLogin".

Затем, чтобы выполнить этот переход из вашего кода, просто сделайте что-то вроде этого:

  if (![prefs stringForKey:@"id"]){

    [self performSegueWithIdentifier:@"segueToLogin" sender:self];

  }

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

EDIT

Итак, просто чтобы ответить на ваш вопрос, представьте себе:

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

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

Теперь для сегментов вы создаете их в раскадровке, чтобы позволить пользователю перемещаться по сценам. Иногда эти переходы напрямую связаны с кнопкой или чем-то еще. Но в этом случае вы не хотите просить пользователя нажать кнопку или что-то еще, чтобы представить логин vc, поэтому вы выполняете переход самостоятельно.

Надеюсь, это имеет смысл.

3 голосов
/ 06 апреля 2012

У меня была похожая проблема, но она не была указана выше.Проблема состояла в фактическом новом файле контроллера представления .m (тот, который я пытаюсь нажать / модальный).Внутри есть метод loadView, и если вы оставите его там, XCode проигнорирует xib, который есть в раскадровке, и будет ожидать, что вы выложите представление.Удалите эту функцию, и вместо этого она будет смотреть на xib.

Потратил слишком много времени на эту глупую ошибку, надеюсь, это поможет спасти чужое здоровье.

0 голосов
/ 28 февраля 2015
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
LoginViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...