筆者平時不喜歡講廢話,但是在這里還是要說下,這個功能,我實現的原理。
大家都知道,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
