在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM