如何在applicationDidFinishLaunching中呈现MIDallViewController?

时间:2013-03-22 15:58:53

标签: ios cocoa-touch afnetworking presentmodalviewcontroller launching-application

这是我的情况:
我有一个需要Internet的TaskListViewController(UITableView) 所以我在显示TaskList之前使用AFNetworking进行一些登录工作(使用模拟账号和密码)。

现在我需要让用户设置他们的帐户和密码 所以我只想在登录前提出模态视图(ZTCUserSettingsViewController)。

我花了很多时间,但仍然无效。

有什么方法可以解决这个问题吗?

谢谢。

ZTCAPIClient : AFHTTPClient
ZTCTaskListViewController : UITableViewController

代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
    [ZTCAPIClient login];


    UITableViewController *viewController = [[ZTCTaskListViewController alloc] initWithStyle:UITableViewStylePlain];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];


    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}

2 个答案:

答案 0 :(得分:1)

我没有看到示例代码尝试呈现模态视图控制器的位置。也许它发生在-[ZTCAPIClient login]内。

一般来说,在呈现视图控制器的视图位于视图层次结构中之前,您无法呈现模态视图控制器。对于您的具体问题,这意味着您的程序需要在读取[self.window makeKeyAndVisible];的行之后的某个时间呈现模式。如果你的程序试图提供模态视图控制器之前它将无法工作,事实上,你可能会看到一个错误消息记录到调试控制台。

在旁注中,您应该注意不要让您的程序在-application:didFinishLaunchingWithOptions:中执行太多操作。如果您的程序耗时太长,系统可能会以iOS App Programming Guide状态终止您的应用:

  

您的申请:willFinishLaunchingWithOptions:和   application:didFinishLaunchingWithOptions:方法应始终为   轻量级,以减少您的应用程序的启动时间。应用程序是   期望启动并初始化自己并开始处理事件   在不到5秒的时间内。如果应用程序未完成其启动周期   及时地,系统将其杀死以使其无反应。因此,任何   可能会降低启动速度的任务(例如访问网络)   应该在辅助线程上异步执行。

     

当启动到前台时,系统也会调用   applicationDidBecomeActive:完成过渡到的方法   前景。因为在启动时和何时调用此方法   从后台转换,使用它来执行任何任务   这两种转变是共同的。

答案 1 :(得分:0)

这是我的最终解决方案:

启动:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

UINavigationController *nav = [[UINavigationController alloc] init];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];

//important!
[ZTCAPIClient registerUserInfo];

return YES;
}

在ZTCAPIClient.m中:

+ (void) registerUserInfo {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSString *account = [defaults stringForKey:@"account"];
if(!account) {
    // load default value
    [self performSelector:@selector(registerDefaultsFromSettingsBundle)];
    ZTCUserSettingsViewController *userSettingsView = [[ZTCUserSettingsViewController alloc] init];
    UINavigationController *usersSettingsNav = [[UINavigationController alloc] initWithRootViewController:userSettingsView];
    [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentModalViewController:usersSettingsNav animated:NO];
} else {
    DLog(@"**********************");
    if ([ZTCAPIClient loginWithAccount:[defaults stringForKey:@"account"] Password:[defaults stringForKey:@"password"] Mode:[defaults stringForKey:@"requestType"] BaseURL:[defaults stringForKey:@"url"]]) {
        DLog(@"Log in SUCCESS");
        UITableViewController *viewController = [[ZTCTaskListViewController alloc] initWithStyle:UITableViewStylePlain];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
        [[[[UIApplication sharedApplication] delegate] window] setRootViewController:nav];
    } else {
        DLog(@"Log in FAIL");
        ZTCUserSettingsViewController *userSettingsView = [[ZTCUserSettingsViewController alloc] init];
        UINavigationController *usersSettingsNav = [[UINavigationController alloc] initWithRootViewController:userSettingsView];
        [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentModalViewController:usersSettingsNav animated:NO];
    }
}
}