Я использую раскрутку, чтобы развернуться к начальному контроллеру представления в моей раскадровке. Раскрутка работает отлично, я реализовал этот метод в своем начальном контроллере представления:
- (IBAction) unwindToInitialViewController:(UIStoryboardSegue *) unwindSegue {
}
Однако, если я попытаюсь перейти к другому контроллеру представления после раскрутки, я получу следующую ошибку:
Предупреждение: Попытка представить, чье представление не находится в иерархии окон!
Похоже, это происходит только в том случае, если я отключаюсь от контроллера представления, который отмечен как «Исходный контроллер представления» в раскадровке. Это ошибка? Должен ли я быть в состоянии расслабиться до этого начального контроллера? Другие идеи?
ИЗМЕНИТЬ:
Вот как я выполняю второй переход:
[self performSegueWithIdentifier:@"mySegue" sender:nil];
Я должен отметить, что это проблема входа/выхода из системы. Когда я вхожу в систему в первый раз, переход от моего контроллера входа к моему следующему контроллеру работает. Когда я выхожу из системы, я возвращаюсь к начальному контроллеру представления. Затем я снова вхожу в систему, и переход от моего контроллера входа к следующему контроллеру не работает.
РЕДАКТИРОВАТЬ 2:
Из дополнительных исследований я нашел его, потому что я использую делегата для входа в систему. Вход в систему асинхронный, я делаю вызов с помощью AFNetworking, и когда это делается, я вызываю своего делегата входа в систему (в данном случае VC входа). В этот момент VC для входа может перейти к представлению.
Код входа:
- (void) login: (NSDictionary *) parameters {
[http.manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, NSDictionary *response) {
[self.loginDelegate loginSuccess:response];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[self.loginDelegate loginFailure:error];
}];
}
Мой логин VC, который является делегатом:
- (void) loginSuccess:(NSDictionary *) response {
// setup user info based on response
...
// Segue
[self performSegueWithIdentifier:@"loginSuccessSegue" sender:nil];
}
Я проверил, что я в основном потоке, когда я перехожу, и все еще не повезло. Я знаю, что AFNetworking всегда вызывает блоки успеха/неудачи и в основном потоке.
Сложная часть. Если я изменю приведенный выше код, чтобы использовать блок, а не делегат, раскадровка/переход не испортится, и я смогу без проблем входить и выходить из системы много раз.
Почему переход работает в первый раз с шаблоном делегата, но при выходе из системы (раскрутке) я не могу использовать этот переход снова?
ИЗМЕНИТЬ 3:
Дальнейшее исследование показывает, что при раскрутке моего входа в систему VC viewDidAppear вызывается дважды. При первоначальной раскрутке представление все еще находится в стеке, покажите, что оно отображается быстро, и вызывается viewDidAppear. Однако это быстро анимируется, и viewWillAppear вызывается во второй раз с другим VC. Я думаю, что это может быть корнем проблемы. Почему, когда я расслабляюсь в этом VC, он анимируется только для того, чтобы снова анимироваться?
self
во втором примере перехода? - person Phillip Mills   schedule 21.09.2015