美文网首页iOS 进阶
白夜缉凶1:Xib的File's Owner引发的血案

白夜缉凶1:Xib的File's Owner引发的血案

作者: 独孤流 | 来源:发表于2019-05-13 14:40 被阅读14次

【iOS】Xib的使用与File'Owner总结
通过file's owner构建可在sb中使用的xib
macOS 和 iOS 中 Nib 文件实现原理以及最佳实践
使用XIB开发界面

Github完整Demo

前言

在日常开发中一些变化不多的页面常用Xib来创建,主要是因为简单而且比较直观,当然也可以用Storyboard或者纯code来写,至于选择哪一种,自然是萝卜白菜各有所爱

遇到的问题1:

同事写好了一个Xib及对应的View,但通过[[[NSBundle mainBundle] loadNibNamed:@"xxxxView" owner:nil options:nil] firstObject]的方式获取到后加到某个页面展示,展示是正常的,但是在再根据特定的场景隐藏这个Xib里的某些子View时发现没生效

缉凶过程:

然后debug一看,用这个xib创建的view里使用outlet的变量全是nil,仔细和以前使用的一些xib比较,发现这个Xib除了指定Class外还多指定了File's Owner,正式因为这个原因,导致加载后导致outlets没有关联到通过xib创建

解决之道:

发现了问题就自然能解决对应的问题了,解决方式如下:
解决方式1、去掉Xib的File's Owner,变成默认的NSObject,再把File's Owner对应的outlets删掉,之后再重新拖下outlets

解决方式2、如果拖的outlet比较多,用一一删除并重新连线比价麻烦,也可以创建一个File's Ower的实例xxx作为[[[NSBundle mainBundle] loadNibNamed:@"xxxxView" owner:xxx options:nil] firstObject]来获得对应的引用,但Xib实例化的view和outlets引用的就不是同一个实例了,而我遇到的这个File‘s Owner比较特殊,设置的就是这个VIew的class,所以可以将xib实例化的view加到outlets所在的view,这样就没啥问题了,具体如下:

延伸:
Xib的这个File's Owner特性正很好的被带有Xib的controller使用,内部的实现机制大概也是先创建一个xxxcontroller的实例,然后在把这个controller的实例传入xib创建一个view,在把这个view设置成controller的view

相关文章

网友评论

    本文标题:白夜缉凶1:Xib的File's Owner引发的血案

    本文链接:https://www.haomeiwen.com/subject/jvgfaqtx.html