0

这是我的情况:
我有一个需要 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;
}
4

2 回答 2

1

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

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

附带说明一下,您应该注意不要让您的程序在-application:didFinishLaunchingWithOptions:. 如果您的程序花费的时间太长,系统可能会终止您的应用程序iOS App Programming Guide指出:

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

在启动到前台时,系统也会调用 applicationDidBecomeActive: 方法完成到前台的转换。因为在启动时和从后台转换时都会调用此方法,所以使用它来执行两个转换共有的任何任务。

于 2013-03-25T02:42:45.507 回答
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];
    }
}
}
于 2013-03-25T11:56:27.047 回答