【问题标题】:iOS Change rootViewController DynamicallyiOS 动态更改 rootViewController
【发布时间】:2016-06-24 09:20:49
【问题描述】:

我想动态更改 rootViewController。这取决于json响应。我有一个 BOOL 值,它在得到 json 响应后会发生变化。问题是即使条件为真,这个值也不会改变。

我的代码在下面,我把它放在应用程序 didFinishLaunchingWithOptions 中:

isTime = NO;
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:
                                                           [url
                                                              stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ]];


__block NSDictionary * json;
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,NSData *data,NSError *connectionError){
       json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&connectionError];
    NSLog(@"JSON >>>> %@",[json objectForKey:@"status"]);
    if ([[json objectForKey:@"status"] isEqualToString:@"ok"]) {
        isTime = YES;
    }
}];
if(isTime){
//rootView1
}else{
 //rootView2
}

我该如何解决这个问题?有什么想法吗?

【问题讨论】:

  • -application:didFinishLaunchingWithOptions: 中你绝不能这样做,你的整个概念是完全错误的。您需要尽快吃完午餐,然后在之后开始您的自定义工作网络操作。

标签: ios objective-c rootviewcontroller


【解决方案1】:

如下更改您的代码。

 {   
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:
                                                               [url
                                                                  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ]];


__block NSDictionary * json;
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,NSData *data,NSError *connectionError){
       json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&connectionError];
    NSLog(@"JSON >>>> %@",[json objectForKey:@"status"]);
    if ([[json objectForKey:@"status"] isEqualToString:@"ok"]) {
        //rootView1
        //Change RootVC to RootView1
    }
    else {
        //rootView2
         //Change RootVC to RootView2
    }

}];

//Add LoadingVC (Intermediate) RootVC

}

-(void) changeRootViewController:(UIViewController*) viewController {
    [[[[UIApplication sharedApplication] delegate] window] setRootViewController: viewController];
}  

【讨论】:

  • 我做到了,应用程序崩溃原因:应用程序窗口应该在应用程序启动结束时有一个根视图控制器。
【解决方案2】:

很简单,换个窗口-rootViewController

-(void) changeRootViewController:(UIViewController*) vc {
    [[[[UIApplication sharedApplication] delegate] window] setRootViewController: vc];
}

由于距离我上次用 objC 写东西已经很久了,可能会有语法错误,但我认为它可以给你一个想法。

【讨论】:

    【解决方案3】:

    // 像这样试试

    isTime = NO;
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:
                                                           [url
                                                              stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ]];
    
    
    __block NSDictionary * json;
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,NSData *data,NSError *connectionError){
       json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&connectionError];
    NSLog(@"JSON >>>> %@",[json objectForKey:@"status"]);
    if ([[json objectForKey:@"status"] isEqualToString:@"ok"]) {
        [self changeRootController:YES];
    } else {
       [self changeRootController:NO];
     }
    }];
    
    
    -(void)changeRootController:(Bool)change {
       if(change){
           //rootView1
       } else{
         //rootView2
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      相关资源
      最近更新 更多