【问题标题】:How to presentModalViewController in applicationDidFinishLaunching?如何在 applicationDidFinishLaunching 中呈现 ModalViewController?
【发布时间】:2013-03-22 15:58:53
【问题描述】:

这是我的情况:
我有一个需要 Internet 的 TaskListViewController(UITableView)。
所以我在显示任务列表之前使用 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;
}

【问题讨论】:

  • 您的用户应该多久输入一次用户名和密码?每次启动应用程序时还是仅在他们第一次使用时?
  • @MikeD 只有第一次,我可以检查有关帐户的用户默认值。

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


【解决方案1】:

我看不到您的示例代码试图在哪里显示模态视图控制器。也许它发生在-[ZTCAPIClient login] 内部。

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

附带说明,您应该注意不要让您的程序在-application:didFinishLaunchingWithOptions: 中做太多事情。如果您的程序耗时过长,系统可能会终止您的应用程序 iOS App Programming Guide 状态:

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

当启动到前台时,系统还会调用 applicationDidBecomeActive:完成向 前景。因为这个方法在启动时和什么时候都被调用 从后台转换,使用它来执行任何任务 这两种转换是共同的。

【讨论】:

  • 我在想一些代码,一旦发现它没有登录,它就不会运行其余代码
【解决方案2】:

这是我的最终解决方案:

启动:

- (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];
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多