知识点总结27:app加载网页

1.拿到当前控制器的导航控制器进行网页的跳转,可以转化为拿到当前窗口根控制器的选中的NavVC控制器来跳转


- (void)squareBtnClick:(ZGKMeFooterviewButton *)button{
    
    ZGKLog(@"url -- %@", button.square.url);

    // 1.根据不同的协议进行处理(hasPrefix: && hasSuffix: && containsString:)
    if ([button.square.url hasPrefix:@"http"]) {// 利用webview加载
        ZGKLog(@"利用webview加载url")
        // 0.自定义webView
        ZGKWebViewController *webView = [[ZGKWebViewController alloc] init];
        // 将要跳转的url传递给webviewController
        webView.url = button.square.url;
        
        // 1.获得"我的"模块对应的导航控制器(通过多态,强制转化为父类,所以就不用子类ZGKTabBarController来接收对象)
        // 拿到窗口根控制器的2种方法:[UIApplication sharedApplication].keyWindow和self.window
        // 记得返回的对象不是UIViewController的时候,要强转
//        UITabBarController *tabBarVC = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
        UITabBarController *tabBarVC = (UITabBarController *)self.window.rootViewController;
        //  打印结果:tabBarVC = ZGKTabBarController
        NSLog(@"tabBarVC = %@", [tabBarVC class]);
        UINavigationController *navVC = tabBarVC.selectedViewController;
      
        [navVC pushViewController:webView animated:YES];
    }else if ([button.square.url hasPrefix:@"mod"]){ // 另行处理
        ZGKLog(@"mod协议,内部处理")
        // mod协议内部如果包含不同的内容进行不同的处理
        if ([button.square.url containsString:@"BDJ_To_Check"]) {
            ZGKLog(@"跳转到[审帖]界面");
        }else if ([button.square.url containsString:@"BDJ_To_RecentHot"]){
            ZGKLog(@"跳转到[每日排行]界面");
        }
    }else{
        ZGKLog(@"不是http或者mod协议")
    }
  • 拿到当前窗口根控制器的方法有两种:[UIApplication sharedApplication].keyWindow和self.window, 记得返回的对象不是UIViewController的时候,要强转.
  • 拿到UITabBarVC当前选中的控制器,可以用selectedViewController属性
 // 1.获得"我的"模块对应的导航控制器(通过多态,强制转化为父类,所以就不用子类ZGKTabBarController来接收对象)
        // 拿到窗口根控制器的2种方法:[UIApplication sharedApplication].keyWindow和self.window
        // 记得返回的对象不是UIViewController的时候,要强转
//        UITabBarController *tabBarVC = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
        UITabBarController *tabBarVC = (UITabBarController *)self.window.rootViewController;
        //  打印结果:tabBarVC = ZGKTabBarController
        NSLog(@"tabBarVC = %@", [tabBarVC class]);
        UINavigationController *navVC = tabBarVC.selectedViewController;

        [navVC pushViewController:webView animated:YES];

2.自定义webView加载网页是没有进度条的,即使后续添加上去也不是加载的进度,要想有进度条就要用SFSafariViewController加载网页,并且要用 presentViewController:出该控制器


#import 

- (void)squareBtnClick:(ZGKMeFooterviewButton *)button{
    
    ZGKLog(@"url -- %@", button.square.url);

    // 1.根据不同的协议进行处理(hasPrefix: && hasSuffix: && containsString:)
    if ([button.square.url hasPrefix:@"http"]) {// 利用webview加载
        ZGKLog(@"利用webview加载url")
        // 0.自定义webView
//        ZGKWebViewController *webView = [[ZGKWebViewController alloc] init];
//        webView.url = button.square.url;
        
        // 1.获得"我的"模块对应的导航控制器(通过多态,强制转化为父类,所以就不用子类ZGKTabBarController来接收对象)
        // 拿到窗口根控制器的2种方法:[UIApplication sharedApplication].keyWindow和self.window
        // 记得返回的对象不是UIViewController的时候,要强转
//        UITabBarController *tabBarVC = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
        UITabBarController *tabBarVC = (UITabBarController *)self.window.rootViewController;
        //  打印结果:tabBarVC = ZGKTabBarController
        NSLog(@"tabBarVC = %@", [tabBarVC class]);
//        UINavigationController *navVC = tabBarVC.selectedViewController;
      
        
        SFSafariViewController *webView = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:button.square.url]];
//       如果是push出来的SFSafariViewController,则进度条会被导航栏挡住
//        [navVC pushViewController:webView animated:YES];
        [tabBarVC presentViewController:webView animated:YES completion:nil];
    }

总结:

  • 1.使用 SFSafariViewController要导入#import

  • 2.要看到进度条,只能presentViewCotroller,不能是pushViewController

你可能感兴趣的:(知识点总结27:app加载网页)