Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么可以';更改ViewController根视图的UIView类_Ios_Uiview_Uiviewcontroller_Iboutlet - Fatal编程技术网

Ios 为什么可以';更改ViewController根视图的UIView类

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

如果我用一个视图模板启动一个Xcode程序,它将默认为一个VC和一个已经在该VC中设置为IBOutlet的视图,这样我就可以在我的视图控制器中使用
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一样。