有的時(shí)候甸鸟,我們需要在某個(gè)view中獲取到這個(gè)view所在的控制器撇贺,以便進(jìn)行controller相關(guān)的操作巡莹,比如push到一個(gè)新的控制器司志,下面就介紹一下如何獲取。
我們可以為UIView寫一個(gè)分類降宅,如下:
.h文件中:
#import <UIKit/UIKit.h>
@interface UIView (KFGetController)
//獲取當(dāng)前view所在的控制器
- (UIViewController *)viewController;
@end
.m文件中:
#import "UIView+KFGetController.h"
@implementation UIView (KFGetController)
- (UIViewController *)viewController
{
//獲取當(dāng)前view的superView對(duì)應(yīng)的控制器
UIResponder *next = [self nextResponder];
do {
if ([next isKindOfClass:[UIViewController class]]) {
return (UIViewController *)next;
}
next = [next nextResponder];
} while (next != nil);
return nil;
}
@end
寫完這個(gè)分類之后骂远,就可以在需要獲取控制器view中調(diào)用
UIViewController *controller = [self viewController]; 得到的這個(gè)controller就是當(dāng)前view所在的控制器。
如果是在某個(gè)自定義view中腰根,而這個(gè)view會(huì)被添加到某個(gè)viewController的view中激才,此時(shí)需要在這個(gè)自定義view的
- (void)willMoveToSuperview:(UIView *)newSuperview
在這個(gè)方法中調(diào)用[newSuperView viewController];就可以順利拿到這個(gè)控制器了。
但是其實(shí)蘋果并不推薦這么做,這樣做違反了蘋果的設(shè)計(jì)原則贸营,即合適的地方干合適的事,除非確實(shí)有這種需要岩睁,否則還是少用為妙钞脂!希望上面的介紹對(duì)你有幫助!