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