首页 > 代码库 > UIViewController
UIViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
默认的初始化方法。
虽然可以,但不要在这里初始化view,因为如果在这里初始化view,系统就不会再调用loadvVew和viewDidLoad。其实,只要在调用该属性的get方法之前给view赋值(调用view的set方法),都会造成不调用loadvVew和viewDidLoad。
@property(nonatomic,retain) UIView *view;
在view == nil的时候,任何调用view的get方法(xxxx = self.View)都会调用loadvVew和viewDidLoad。因为有这个功能,所以子类重写get或set方法,必须先调用super的get或set方法。
- (void)loadView;
这个方法里,应该给view赋需要的值(使用nib,不要实现该方法)。并且应该保不在调用该方法之前调用view的set方法。
- (void)viewWillUnload NS_DEPRECATED_IOS(5_0,6_0);
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0);
6.0废弃,因为6.0以后,内存不足警告并不会使视图控制器释放未显示的视图。
- (void)viewDidLoad;
在loadView后被调用,一般在view上加button之类的代码,都写在这里。
- (BOOL)isViewLoaded
视图是否被加载
@property(nonatomic, readonly, copy) NSString *nibName;
返回nlb的名字.
@property(nonatomic, readonly, retain) NSBundle *nibBundle;
从这个boundle加载nib,可以通过这个属性获取nib
@property(nonatomic, readonly, retain) UIStoryboard *storyboard
返回viewcontroller使用的storyboard。
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
先谈谈这个Segue,其实就是storyboard里连接两个控制器的那根线。传入Segue的identifier,实现跳转。
ps:(跳转后,当前控制器的nextResponder指向跳转之前的控制器)
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
这个方法用来重写,为跳转时(也就是从一个viewcontroller换到另一个viewcontroller)系统自动调用。传入的identifier参数表示Segue的id。默认是返回yes,返回no的话表示不执行跳转。可根据identifier参数设置分支语句,屏蔽相应的跳转。(注意,调用performSegueWithIdentifier并不会调用该方法,也就是说,这个方法即使返回no,也并不能阻止performSegueWithIdentifier执行跳转)
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
执行跳转的时候,在两个viewcontroller间传数据,个人感觉比较麻烦,要是数据量大的话,会是代码丧失美感(也许是本人技术不精)
有一篇博文对这个函数做了比较详尽的解释,下为连接
StoryBoard学习(5):使用segue页面间传递数据
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
UnwindSegue,ios6新增功能,使当前的控制器退出到任意一个控制器。(interface builder中,viewController下,那个绿色的exit)
对上面这三个方法有强烈求知欲望的,可以参考下面这两篇外文。
外文一,外文二
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
两个系统回调函数,视图将要显示和视图已经显示。看了下外文,一个解释觉得比较靠谱,大意就是,viewWillAppear做一些数据的更新,而viewDidAppear则是做一些比较耗时的任务,例如从服务器下载数据。
原文如下:
外文三
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
一般是在viewWillDisappear里保存数据。
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);
- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0);
和上面几个方法组原理相同,都为系统回调,一个在layoutSubviews之前调用,一个在layoutSubviews之后调用。
@property(nonatomic,copy) NSString *title;
导航控制器上面的文字。
- (void)didReceiveMemoryWarning;
在内存警告下被调用,关于这块内容,有一篇很不错的文章:
ios6 处理内存警告
@property(nonatomic,readonly) UIViewController *parentViewController;
ios5之后,这个方法会返回nil,具体原因,参见这篇文章:
[IOS] UIViewController的parentViewController属性
@property(nonatomic,readonly) UIViewController *modalViewController NS_DEPRECATED_IOS(2_0, 6_0);
ios6废弃。
@property(nonatomic,readonly) UIViewController *presentedViewController NS_AVAILABLE_IOS(5_0);
@property(nonatomic,readonly) UIViewController *presentingViewController NS_AVAILABLE_IOS(5_0);
很好理解的两个属性。
A调用presentViewController出现B,A的presentedViewController指向B,B的presentingViewController指向A。
@property(nonatomic,assign) BOOL definesPresentationContext NS_AVAILABLE_IOS(5_0);
@property(nonatomic,assign) BOOL providesPresentationContextTransitionStyle NS_AVAILABLE_IOS(5_0);
- (BOOL)isBeingPresented NS_AVAILABLE_IOS(5_0);
可以判断一个控制器是否由presentingViewController呈现,在viewWillAppear,viewDidAppear中调用。
- (BOOL)isBeingDismissed NS_AVAILABLE_IOS(5_0);
可以判断一个控制器是否由presentingViewController撤销,在viewWillDisappear,viewDidDisappear:中调用。
- (BOOL)isMovingToParentViewController NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingFromParentViewController NS_AVAILABLE_IOS(5_0);
和上面的差不多,判断是否由父视图控制器呈现或撤销。
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_AVAILABLE_IOS(5_0);
标准的呈现视图方法,代替 presentModalViewController:animated,如果实现了completion,将会在viewControllerToPresent的viewDidAppear中被调用。
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion NS_AVAILABLE_IOS(5_0);
关闭视图,退回到上一视图。代替 dismissModalViewControllerAnimated: ,如果实现了completion,将会在该视图控制器的viewDidDisappear:中调用。[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
一般这样做。
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);
- (void)dismissModalViewControllerAnimated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);
ios6废弃
@property(nonatomic,assign) UIModalTransitionStyle modalTransitionStyle NS_AVAILABLE_IOS(3_0);
用于设置过场动画的类型。
@property(nonatomic,assign) UIModalPresentationStyle modalPresentationStyle NS_AVAILABLE_IOS(3_2);
这个是要给被呈现的控制器设置才会生效,而不是调用presentViewController的控制器。
- (BOOL)disablesAutomaticKeyboardDismissal NS_AVAILABLE_IOS(4_3);
返回yes,则不能通过resignFirstResponder隐藏键盘,UIModalPresentationFormSheet模式下,要自动隐藏键盘,需要重写这个方法,并返回NO。
@property(nonatomic,assign) BOOL wantsFullScreenLayout NS_AVAILABLE_IOS(3_0);
默认返回NO,返回YES的话,view会以延伸到bar下面。
-----------------------------
先就这么多。