要在一个UIView里添加另一个UIViewcontroller里面的方法的view要怎么做

深入讲解iOS开发中的UIViewController
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了iOS开发中的UIViewController,其中以UIViewController作为着重讲解,需要的朋友可以参考下
UIViewController顾名思义:视图控制器。应该在MVC设计模式中扮演控制层的角色。一些初学者在最开始的时候一直不理解为何有了UIView还要UIViewController做什么用,不都是向视图中增加view。在此我要声明一下
UIViewController和Uiview是两个不同的类UIViewController是视图控制器 而UIView是视图也就是说,UIViewController是控制UIView的。你也可以认为UIViewController就是一个相框,而UIView就是一个相片,相框可以随时随地的拿走这个相片而换另外一张相片,或者在这张相片上加一个新的相片。而相片却不能操纵相框的。 UIView工作在第一线,向用户展示表现的内容,并接受用户的交互。UIViewController相当于导演,按照计划编排属下的UIView以何种形式展现,其中包含一些花哨的技巧,如翻转、淡入淡出等。 UIVewController的另一个功能是处理用户交互操作,注意这里我说的是”处理”,当然UIViewController本身是不知道用户交互的,这就需要UIView将用户的交互操作(例如:touchesBegintouchesMoved)传递上来。一般常用的两种方法完成这种传递: 1、[self nextResponder] touchesBegin:touches… 2、使用Notification 不管以何种方式,如果UIViewController得到了用户的输入,那么它应该对UIView做些改变以响应用户的输入,这里要注意UIViewController应该只改变UIView的表现,而不应该处理其它事情,更多的操作通过Delegate来进行,关于Delegate的应用场合下次讲解消息的传递方式中一起阐述。请大家记住:UIView是一个视图,UIViewController是一个控制器,每一个viewController管理着一个view。
如果你开发的应用界面非常的简单,确实没有必要用控制器控制视图,但是对于视图中复杂的数据显示和数据处理,如果没有这个控制器,这样会使得代码的继承深度大大增加,不利于代码的阅读,首先看下官方API对UIViewController的解释:The UIViewController class provides the fundamental view-management model for iPhone applications(视图控制器为Iphone的应用程序提供了基础的视图管理模型) You use each instance of UIViewController to manage a view hierarchy(你可以使用视图控制器管理视图的继承)。从这里就可以看出,如果使用了视图控制器,你就可以方便的管理视图中的子视图,假如没有了这个控制器,可想而知每个视图岂不是都要用继承才能管理彼此的关系。
UIViewController的基础功能是管理界面中的view,但是一个复杂的应用程序肯定有好多的视图控制器,那么自然如果视图控制要有管理自己的功能就更加强大。先看API文档:View controllers rarely operate in isolation.If your application uses a navigation or tab bar controller,or if your application presents views modally,then it typically has several view controllers interacting with each other to implement those navigation features(视图控制器很少单独使用。假如你的应用程序要使用导航或者转换条控制器,或许是你的应用程序要呈现模态的视图,明显的这里有很多的视图控制器相互关联来实现导航的功能)。所以可以看出,UINavigationController和UITabBarController是用来控制视图控制器的使用的,同样他们的跟视图也是UIViewController,这里就说明了UIViewController是自己可以控制自己的。这也是为何我们使用UINavigationController的时候不允许在把一个NavigationController推入堆栈中,这样极容易形成自己队递归调用自己,造成堆栈溢出。以下是使用UIViewController应该注意的地方。
1.首先看loadView和viewDidLoad的区别,两者都是用来初始化试图控制器中的视图如何显示的。还是先看官方API解释:If you create your views manually, you must override this method and use it to create your views.If you use Interface Builder to create your views and initialize the view controller that is,you initialize the view using the initWithNibName:bundle: method,set the nibName and nibBundle properties directly, or create both your views and view controller in Interface Builder—then you must not override this method.(如果你手动创建一个视图控制器,你必须重载这个方法,去使用他创建你的视图。如果你使用Interface builder创建和初始化的视图控制器,你就不必重载此方法)。所以当你手动创建一个视图控制器的时候一定要注意重载loadView,否则你的视图将不回显示你增加的任何字视图。
2.viewDidUnLoad这个方法最容易误导人,先看API解释:Called when the controller's view is released from memory(当控制器的视图从内存中释放的时候被调用),个人觉得官方的解释对英语非母语的国家的人来说,很容易理解为视图控制器release的时候,调用此方法。但是如果实际调试以下,视图控制器释放的时候不会调用该方法。再进一步分析API文档:This method is called as a counterpart to the viewDidLoad method.
It is called during low memory conditions when the view controller needs to release its view
and any objects associated with that view to free up memory(这个方法是被调用相对于viewDidLoad方法的,在内存警告的情况下,当试图控制器需要释放它的视图和这个视图中相关联的任何对象来释放内存的时候,调用此方法)。这里还有一点要注意的时,当出现内存警告的时候,是调用正在显示的视图控制器的父视图控制器的viewdidUnload方法,而不是正在显示的视图控制器的viewDidUnload方法。因为如果调用了正在显示的视图控制器的viewDidUnload方法,那么用户正在看的界面就会消失,虽然释放了内存但是用户显然没法接受,自然要释放该视图下面看不到的视图控制器中的视图。被释放的视图,下次加载的时候再调用viewDidLoad的方法,所以ViewDidUnload的方法是和viewDidload方法相互对应的。
UIViewController生命周期
UIViewControl是IOS程序中的一个重要组成部分,扮演者一个大管家的身份,管理着程序中的众多视图,今天看看了官方文档并做了如下一些简单的记录:
何时加载view,加载的原则是什么,视图何时消失等问题,文档中讲的都很详细。
  Controller的view最好在需要显示时再去加载,并且在系统发出内存警告时释放比必要的view及相关的数据对象。
一、UIViewController的初始化
  初始化时会根据需要调用init,initWithCoder等相关函数,这个时候我们可以做一下简单的初始化操作,建立ViewController中需要使用的数据模型等,不建议在初始化阶段就直接创建view及其他与显示有关的对象(应该放到loadView的时候去创建,或者采用懒加载的方法创建)。
  我们都知道ViewController可以通过代码和xib两种方式创建,这两种方式的初始化流程也不尽相同。
  1)使用xib创建的VC
  xib其实最终是会把我们的设置保存成一个数据集,当需要初始化构建VC的时候,回去读取记录的数据集,然后帮我们动态的创建VC,因此可以想象它在初始化时会先去找看是否实现initWithCoder方法,如果该类实现了该方法,就直接调用initWithCoder方法创建对象,如果没有实现的话就调用init方法。调用完初始化方法以后紧接着会调用awakeFromNib方法,在这个方法里面我们可以做进一步的初始化操作。
  2)使用代码创建VC
  使用代码创建时,我们根据需要手动的创建VC中的数据,如果自己定制VC时,还需要在init中调用[super init]。
二、UIViewController中View的load和unload
  前面讲了不建议在VC初始化的时候就创建view及其他与显示相关的代码,官方文档建议将View的初始化操作放到loadView的时候再做,当VC接到内存告警时会调用didRecieveMemoryWarning这个时候我们就要做出响应,释放暂时不需要的对象。如果无视这个警告,系统内存不够用时会会继续发送,如果还得不到处理就会强制退出程序。下面看具体的loadView和unloadView时候都会做什么操作。
  1)Load周期
当需要显示或者访问view属性时,view没有创建的话,VC就会调用loadView方法,在这个时候会创建一个view并将其赋给VC.view属性。紧接着就会调用VC的viewDidLoad方法,这个时候VC.view保证是有值的,可以做进一步的初始化操作,例如添加一些subview。注意:定制VC时,如果覆盖loadView方法,不需要调用[super loadView]方法。
  2)Unload周期
当app收到内存警告的时候,会调用每一个VC的didRecieveMemoryWarning方法,我们需要做出响应,释放程序中暂时不需要的资源。通常都会重写该方法,重写时候需要调用super的该方法。如果检测到当前VC的view可以被安全释放的话,就会调用viewWillUnload方法,这个我们必须要重视,因为当VC的view消失时候它的subviews可能会被一起释放,我们需要根据具体情况做一些记录,以保证下次能够正确创建,同时不出现内存泄漏。调用viewWillUnload以后,会将VC.view属性设置成nil,然后在调用viewDidUnload方法,这个时候我们可以释放那些强引用的对象。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具本文讲的是详解iOS App开发中UIViewController的loadView方法使用_IOS,
当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法。这个方法就会加载或者创建一个view对象,赋值给view属性。
当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法。这个方法就会加载或者创建一个view对象,赋值给view属性。
loadView默认做的事情是:如果此ViewController存在一个对应的nib文件,那么就加载这个nib。否则,就创建一个UIView对象。
如果你用Interface Builder来创建界面,那么不应该重载这个方法。
控制器的loadView方法以及view属性控制器有一个view属性,我们经常在控制器中通过self.view来访问。这个view是一个很有意思的东西。
首先要明白这个view到底是什么东西。
一个控制器成为window的根控制器的时候,当这个界面即将显示,控制器的view会被加到window中用来显示界面。正常情况下控制器自带的view是"无色透明"的。
如果你在设置window的根控制器前创建一个Button直接加到window上,此时button出现在window上,但是在控制器的view的下面。此时点击按钮会发现按钮并不会响应点击。
这是因为控制器的view拦截了点击事件,这说明它并非真的完全透明(因为如果完全透明,那么不会拦截点击事件,可以设置viewController.view.alpha = 0来验证,此时按钮就可以响应点击)。事实上view是一个backgroundColor为clearColor的视图,clearColor是几乎透明的颜色但是并非完全透明,也就是说当有类似点击事件发生的时候,clearColor背景的view会拦截点击事件,因为它并非完全透明。
所以可以说控制器的view是一个看不见摸得着的东西...
另外view是懒加载的,也就是说,只有真正使用到控制器的view的时候它才会被创建出来。它就是在控制器的-loadView方法中创建出来的。
复制代码 代码如下:
- (void)loadView
// 类似这种实现
// 可能还会进行更多的操作,比如判断是否有指定storyboard,如果是就会加载storyboard中控制器的view等操作
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor clearColor];
前面说过,view是懒加载的,所以当使用self.view的时候:
复制代码 代码如下:
- (UIView *)view
// 类似这种实现
if (_view == nil) {
[self loadView];
[self viewDidLoad];
当_view为nil的时候会调用loadView方法方法,此时系统默认会创建一个UIView对象并将其赋值给_view,此时_view有了值,接着调用viewDidLoad方法。
当再次访问self.view的时候,因为_view已经有值,所以会直接返回_view。这也是为什么loadView以及viewDidLoad方法只会执行一次。
之前的提到过,在给window设置完根控制器,根控制器的view并不是马上就被加到window上,也就是说此时view还未创建。在[self.window makeKeyAndVisible]之后界面即将显示的时候,这时候需要用到view,此时就会调用view的getter方法,接着执行loadView,在接着执行viewDidLoad等一系列方法。
现在我们知道view是懒加载的,所以如果在[self.window makeKeyAndVisible]之前就用到控制器的view,那么它就会"提前”创建。
复制代码 代码如下:
NSLog(@"%@", viewController.view); // 此时用到view,就会创建view
现在我们知道控制器的view是通过loadView方法创建的了,所以我们可以覆写这个方法来达到改变控制器的自带view的目的:
复制代码 代码如下:
- (void)loadView
JYView *view = [[JYView alloc] initWithFrame:[UIScreen mainScreen].bounds];
view.background = [UIColor blueColor];
此时我们就改变了控制器原本自动创建的view,现在使用self.view则得到的是JYView的对象。
loadView使用中的一些注意点永远不要主动调用这个函数。view controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数。如果你用IB创建view并初始化view controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数。
这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。
所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。
如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ios
uiviewcontroller
uiviewcontroller详解、uiview loadview、uiviewcontroller、ios uiviewcontroller、uiviewcontroller刷新,以便于您获取更多的相关知识。
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!Pages: 1/2
主题 : 要在一个UIView里添加另一个UIViewcontroller的view要怎么做?
级别: 侠客
UID: 406131
可可豆: 425 CB
威望: 389 点
在线时间: 387(时)
发自: Web Page
来源于&&分类
要在一个UIView里添加另一个UIViewcontroller的view要怎么做?&&&
RT本来是应该用[self presentViewController:_BViewController&&animated:YES&& completion:nil];来展示下一个页面的,不过由于self的ViewController找不到而且也没展示出来,只能找到当前的view,所以就希望在当前View下面add一个_BViewController的view,请问有什么方法没~?
级别: 新手上路
可可豆: 65 CB
威望: 15 点
在线时间: 277(时)
发自: Web Page
addSubview:_BViewController.view
级别: 圣骑士
UID: 437920
可可豆: 1255 CB
威望: 1061 点
在线时间: 647(时)
发自: Web Page
[view addsubview: [viewController new].view];
级别: 侠客
可可豆: 170 CB
威望: 160 点
在线时间: 299(时)
发自: Web Page
想知道为什么会有这么奇葩的需求,要从view上面弹出vc?
级别: 侠客
UID: 406131
可可豆: 425 CB
威望: 389 点
在线时间: 387(时)
发自: Web Page
回 3楼(cloud0724) 的帖子
其实是为了在cocos2dx下自己封装iOS功能,为了实现在app内部弹出Appstore的页面。因为我没找到cocos里当下页面的UIViewController,但是oc显示appstore页面需要另一个UIViewcontroller,取不到当前的viewcontroller就跳不出来下一个,所以。。。只能用这种方式权宜了。。。。
级别: 侠客
UID: 406131
可可豆: 425 CB
威望: 389 点
在线时间: 387(时)
发自: Web Page
回 1楼(hoffqu) 的帖子
会报错。。。:libc++abi.dylib: terminate_handler unexpectedly threw an exception
级别: 侠客
UID: 406131
可可豆: 425 CB
威望: 389 点
在线时间: 387(时)
发自: Web Page
回 2楼(zmdRobert) 的帖子
额。。。不行。。。
级别: 新手上路
可可豆: 1 CB
威望: 1 点
在线时间: 5(时)
发自: Web Page
回 3楼(cloud0724) 的帖子
collectionView1的header有一部分是另一个collectionView2,点击这个collectionView2的cell会弹出这个collectionView1,求教
级别: 新手上路
可可豆: 1 CB
威望: 1 点
在线时间: 35(时)
发自: Web Page
[self addsubview: [viewController new].view];
级别: 侠客
UID: 556015
可可豆: 529 CB
威望: 378 点
在线时间: 525(时)
发自: Web Page
回 8楼(saxon396) 的帖子
本人新手、、、想知道这样写会不会有什么安全隐患、或者算是正常写法吗 ?(本人一直认为推view先推控制器)
Lucky or&& loser
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版UIAlertView点击确定后,如何跳转到storyboard中创建的另一个UIViewController? - 知乎3被浏览664分享邀请回答1添加评论分享收藏感谢收起}

我要回帖

更多关于 beego 添加controller 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信