В Xcode 5.0.2 я создал приложение для iPhone (полное приложение code на GitHub, запустите pod install
один раз - для SDWebImage
), в котором отображается список социальных сетей (Facebook, Google+ и т.д.), затем - в другом виде - UIWebView
, отображающий веб-страницу OAuth2, а затем третье представление с аватаром пользователя и информацией (имя, фамилия и т.д.):
(Здесь полноэкранный снимок экрана раскадровки, показанный выше)
Прежде чем отображать аватар пользователя и данные в последнем представлении, я сохраняю данные пользователя в NSUserDefaults
.
Мой вопрос:, когда пользователь запускает приложение в следующий раз и уже есть данные пользователя в NSUserDefaults
- как я могу пропустить первые 2 представления и отобразить (без какой-либо анимации) последний вид с данными пользователя?
Я добавил следующий код в AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *key = [defaults objectForKey:@"key"];
User *user = [User loadForKey:key];
if (user) {
UINavigationController *nc = (UINavigationController*)self.window.rootViewController;
// XXX how to load the last view here? XXX
}
return YES;
}
и может видеть, что пользовательские данные загружаются в порядке, но я не понимаю, как перейти к последнему виду (особенно потому, что большая часть пользовательского интерфейса определена в раскадровке)?
ОБНОВЛЕНИЕ: Я пробовал следовать предложению Томми Александра (спасибо!) со следующим кодом в AppDelegate.m (а также присвоенный Details
StoryboardID до последнего представления):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *key = [defaults objectForKey:@"key"];
User *user = [User loadForKey:key];
if (user) {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *uvc = [storyboard instantiateViewControllerWithIdentifier:@"Details"];
NSLog(@"XXX uvc=%@ user=%@", uvc, user);
[self.window.rootViewController presentViewController:uvc animated:YES completion:nil];
}
return YES;
}
и в то время как последний вид (UserViewController с аватаром пользователя и деталями), похоже, полностью создан, я получаю следующее предупреждение и приложение не переходит к последнему виду:
MyAuth[3917:70b] XXX uvc=<UserViewController: 0x8acbac0> user=
VK
59751265
Alexander
Farber
1945522
http://cs319319.vk.me/v319319265/b7df/TnyKeffL_mU.jpg
0
MyAuth[3917:70b] Warning: Attempt to present <UserViewController: 0x8acbac0> on <UINavigationController: 0x8bb3a30> whose view is not in the window hierarchy!
ОБНОВЛЕНИЕ 2:. Когда я перемещаю вышеуказанный код в viewDidLoad
первого вида (MasterViewController.m, где пользователь может выбрать социальную сеть), затем я получаю другое предупреждение:
MyAuth[1358:70b] XXX uvc=<UserViewController: 0x8a97430> user=
FB
597287941
Alexander
Farber
Bochum, Germany
http://graph.facebook.com/597287941/picture?type=large
0
MyAuth[1358:70b] Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0x8a893e0>.
ОБНОВЛЕНИЕ 3: Спасибо за ценные ответы! Я в конечном итоге использовал предложение Леонтия Дериглазова:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"Master"];
//UIViewController *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"Login"];
UIViewController *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"User"];
User *user = [User load];
NSArray *controllers = (user ? @[vc1, vc3] : @[vc1]);
UINavigationController *nc = (UINavigationController *)self.window.rootViewController;
[nc setViewControllers:controllers];
return YES;
}