Ios 为什么可以';更改ViewController根视图的UIView类
如果我用一个视图模板启动一个Xcode程序,它将默认为一个VC和一个已经在该VC中设置为IBOutlet的视图,这样我就可以在我的视图控制器中使用Ios 为什么可以';更改ViewController根视图的UIView类,ios,uiview,uiviewcontroller,iboutlet,Ios,Uiview,Uiviewcontroller,Iboutlet,如果我用一个视图模板启动一个Xcode程序,它将默认为一个VC和一个已经在该VC中设置为IBOutlet的视图,这样我就可以在我的视图控制器中使用self.view访问它 现在,如果我想要自定义UIView(称为NewView),我可以在项目中添加UIView类文件(.h/.m)。现在,我最初的想法是转到storyboard中的根“UIview”,并将其类更改为“NewView” 假设我在NewView中有一个名为“myProperty”的公共属性,我应该能够使用self.view.myProp
self.view
访问它
现在,如果我想要自定义UIView(称为NewView),我可以在项目中添加UIView类文件(.h
/.m
)。现在,我最初的想法是转到storyboard中的根“UIview”,并将其类更改为“NewView”
假设我在NewView中有一个名为“myProperty”的公共属性,我应该能够使用self.view.myProperty
从VC访问它。事实并非如此
我们是说,对UIView进行子类化的唯一方法是在SB中的根UIView下面添加一个UIView对象,然后从VC创建一个IBOutlet到该UIView吗?因此,如果我不能使用根UIView,那么它的用途又是什么呢?这不是不能子类化UIView的问题(正如您已经看到的),而是编译器识别您的子类的问题
self.view
被声明为指向UIView
对象的指针,而不是您的子类的指针,因此您需要做一些额外的工作来访问它的属性;即:铸造。要访问“myProperty”,请使用[(NewView*)self.view myProperty]代码>。就这么简单
您必须向编译器做出某种承诺,字面上说“self.view
拥有类NewView
,而不是您所认为的,因此要认识到它是这样的。”
作为旁注,我还要确保正确设置了XIB中根视图的类(这意味着,它需要属于类NewView
,否则当您尝试向它发送消息时,您的强制转换将失败并返回一个UIView
对象,该对象不响应-myProperty
,从而引发一般异常).这不是不能子类化UIView
(正如您已经看到的),而是编译器识别您的子类的问题self.view
被声明为指向UIView
对象的指针,而不是您的子类的指针,因此您需要做一些额外的工作来访问它的属性;即:铸造。要访问“myProperty”,请使用[(NewView*)self.view myProperty]代码>。就这么简单
您必须向编译器做出某种承诺,字面上说“self.view
拥有类NewView
,而不是您所认为的,因此要认识到它是这样的。”
作为旁注,我还要确保正确设置了XIB中根视图的类(这意味着,它需要属于类NewView
,否则当您尝试向它发送消息时,您的强制转换将失败并返回一个UIView
对象,该对象不响应-myProperty
,从而引发一般异常)因此,在MVC模型中:UIVC有一个UIView类的“视图”道具,当我们加载项目时,会为UIVC中的“视图”道具创建一个自动出口,以指向UIView类。当我在SB中将UIView(子类)的类更改为NewView时;SB中的“视图”出口已更新,因此它现在指向NewView类。但是在代码端没有任何事情告诉UIVC它所指向的“视图”出口现在是一个NewView类。这就是为什么self.view仍然可以工作的原因,因为“view”是NewView从UIView继承的一个道具,但是,代码不识别NewView的任何新道具,“not recognize”是什么意思?它是否编译?对不起。说清楚点,你提到的铸造解决了这个问题。我在上面评论是为了进一步理解。我的意思是,没有演员;在编写代码时,xCode不会“自动完成”例如属性名。但同样,如果我尝试构建,我会得到一个错误——即使我在UIVC类中包含了“NewView.h”。这是预期的行为,对吗?好吧,Xcode的自动完成取决于CLANG的可怕的错误返回机制,因为self.view指向UIView对象,而不是您的子类,这就好像您在引用UIView,如果您不使用强制转换。所以在MVC模型中:UIVC有一个“视图”类UIView的道具,加载项目时,会为UIVC中的“视图”道具创建一个自动出口,以指向UIView类。当我在SB中将UIView(子类)的类更改为NewView时;SB中的“视图”出口已更新,因此它现在指向NewView类。但是在代码端没有任何事情告诉UIVC它所指向的“视图”出口现在是一个NewView类。这就是为什么self.view仍然可以工作的原因,因为“view”是NewView从UIView继承的一个道具,但是,代码不识别NewView的任何新道具,“not recognize”是什么意思?它是否编译?对不起。说清楚点,你提到的铸造解决了这个问题。我在上面评论是为了进一步理解。我的意思是,没有演员;在编写代码时,xCode不会“自动完成”例如属性名。但同样,如果我尝试构建,我会得到一个错误——即使我在UIVC类中包含了“NewView.h”。这是预期的行为,对吗?好吧,Xcode的自动完成取决于CLANG的可怕的错误返回机制,因为self.view指向UIView对象,而不是您的子类,所以如果不使用强制转换,就好像您引用了UIView一样。