zoukankan      html  css  js  c++  java
  • 在NSObject类中,和继承它的类中,弹出UIAlertcontroller和push、present到其它界面

    笔者平时不喜欢讲废话,但是在这里还是要说下,这个功能,我实现的原理。

    大家都知道,NSObject或者继承它的类里,是不能直接使用界面的。

    这时要想创建界面什么的,怎么办呢?

    大家都知道,界面控件什么的基本都是以UI开头的,已UI开头,就说明他们是属于UIKit框架的。

    所以要在NSObject的子类中使用UI控件,这时候只需要导入UIKit框架就行。这样第一个大问题就解决了,这样就能在NSObject的子类中创建UIKi了。

    那么第二个大问题,如何让他在NSObject中实现界面跳转呢?

    push和present这是两种跳转方式,但是调用这两个方法的前提,是得找到他的视图控制器才可以。

    这时候,就进入到下一个问题了,怎么去找它的视图控制器?

    我们公司的前辈,曾经写过一个在子视图中找到其根父视图的控制器的方法,那么在NSObject的子类中,怎么去找,是不是可以借鉴一下他的方法呢?

    经过一番苦思冥想,终于想到一个方案,我何必纠结这些,我找WIndow的当前窗口视图不就行了吗?于是这个问题也就解决了。

    我把这个找窗口的主视图的方法,封装了出来,大家可以在demo中看到。为了安全起见,代码,我也在博客中写一下。

    #import <Foundation/Foundation.h>
    
    @interface NewObject : NSObject
    
    #pragma mark 弹出AlerController
    - (void)showAlertViewControllerWithTitle:(NSString *)title message:(NSString *)message;
    
    #pragma mark presentViewController
    - (void)presentViewControllerWith:(NSString *)ViewCotrollerClass;
    
    @end
    //
    //  NewObject.m
    //  继承与NSObject的类中弹出UIAlerVIewController
    //
    //  Created by mac on 16/4/25.
    //  Copyright © 2016年贝尔特伦. All rights reserved.
    //
    
    #import "NewObject.h"
    #import "NSObject+ViewController.h"
    @implementation NewObject
    #pragma mark 弹出AlerController
    - (void)showAlertViewControllerWithTitle:(NSString *)title message:(NSString *)message{
        
        UIViewController *viewC = self.ViewController;
        
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
        UIAlertAction *sureAcion = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
        [alertController addAction:cancelAction];
        [alertController addAction:sureAcion];
        
        [viewC presentViewController:alertController animated:YES completion:nil];
        
    }
    
    #pragma mark presentViewController
    - (void)presentViewControllerWith:(NSString *)ViewCotrollerClass{
        
        UIViewController *viewC = self.ViewController;
    #pragma mark push方法跟这一样,只是变变写法
        [viewC presentViewController:[[NSClassFromString(ViewCotrollerClass) alloc] init] animated:YES completion:nil];
    }
    
    
    @end
    //
    //  ViewController.m
    //  继承与NSObject的类中弹出UIAlerVIewController
    //
    //  Created by mac on 16/4/25.
    //  Copyright © 2016年 贝尔特伦. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "NewObject.h"
    
    @interface ViewController ()
    
    #warning 若想以此文件中代码写博客,请署名“贝尔”
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        NewObject *obj = [[NewObject alloc] init];
        
    #pragma mark 此处必须有延迟,因为ViewDidLoad还没执行完的时候,找不到当前Window的窗口视图
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    //        调用弹出ALertController的方法
            [obj showAlertViewControllerWithTitle:@"信息" message:@"错误"];
    //        [obj presentViewControllerWith:@"FirstViewController"];
        });
        
    
    
    }
    
    
    
    @end

    下面是我封装的一个类目,找窗口主视图的。

    //
    //  NSObject+ViewController.h
    //  继承与NSObject的类
    //
    //  Created by mac on 16/4/25.
    //  Copyright © 2016年 贝尔特伦. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    @interface NSObject (ViewController)
    
    - (UIViewController *)ViewController;
    
    @end
    //
    //  NSObject+ViewController.m
    //  继承与NSObject的类
    //
    //  Created by mac on 16/4/25.
    //  Copyright © 2016年 贝尔特伦. All rights reserved.
    //
    
    #import "NSObject+ViewController.h"
    
    @implementation NSObject (ViewController)
    
    - (UIViewController *)ViewController{
        
        UIViewController *viewC = [[[UIApplication sharedApplication] keyWindow] rootViewController];
        
        return viewC;
    }
    
    
    @end

    这个demo我起的名字叫看的懂的拿去用,起这个名字,并不是歧视某些人,只是希望,大家能学会灵活运用,这东西的用处,可大可少,就看你能不能想到。

    我就用这个方法,封装了一个弹出alertcontroller的方法,还在整个项目中,集成了一个加载动画。所有请求数据的地方都有这个动画,前前后后,加上些demo的时间,也就花了三四个小时吧。

    下面附上我的demo的下载地址:http://pan.baidu.com/s/1kVD6gzt

  • 相关阅读:
    Java反射理解
    Object的wait和Thread的sleep
    Android媒体解码MediaCodec,MediaExtractor
    图片加载AsyncTask并发问题
    LruCache缓存机制
    Android高效加载大图
    Android Studio编写运行测试纯java代码可带main()函数
    APP支付宝登录第三方授权如何签约入口在哪里
    Xcode使用HTTP配置
    OC编码问题输出中文
  • 原文地址:https://www.cnblogs.com/zxh-iOS/p/5446445.html
Copyright © 2011-2022 走看看