ios框架详解系列(一)----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下面。

-----------------------------

先就这么多。

你可能感兴趣的:(ios框架详解系列(一)----UIViewController)