Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Objective c 在iOS中转换UIView时遇到问题_Objective C_Ios_Casting - Fatal编程技术网

Objective c 在iOS中转换UIView时遇到问题

Objective c 在iOS中转换UIView时遇到问题,objective-c,ios,casting,Objective C,Ios,Casting,我有一个名为FooView的类,它是UIView的子类,我正试图将UIView对象强制转换为FooView 我是这样做的 FooView *myView = (FooView*) MyViewController.view NSLog(@"Leg is a class of %@",NSStringFromClass([myView class])); // Get UIView here. MyViewController的ivar是UIView类型 我得到一个UIView结果,知道为什么会

我有一个名为
FooView
的类,它是
UIView
的子类,我正试图将
UIView
对象强制转换为
FooView

我是这样做的

FooView *myView = (FooView*) MyViewController.view
NSLog(@"Leg is a class of %@",NSStringFromClass([myView class])); // Get UIView here.
MyViewController
的ivar是
UIView
类型


我得到一个UIView结果,知道为什么会发生这种情况吗?

强制转换是一个编译时操作。它不会神奇地改变对象的类型。它主要用于编译时检查和一些运行时魔术
myView
仍然是
UIView
,而不是
FooView

你问题中的这两行应该给你答案:

MyViewController的ivar是UIView类型。我得到一个UIView结果

所有Objective-C对象都有一个名为
isa
的指针,该指针指向类型为
Class
的对象。强制转换不会更改该指针,也不会更改对象的大小


如果要使用
FooView
,则需要更改控制器中的属性类型,如果使用的是Interface Builder,则需要更改右侧检查器中UIView的类型。

可以在MyViewController中创建loadView方法,该方法创建FooView并将其设置为self.view。它适用于不使用笔尖的情况。

可以,但是可以将
FooView
定义的选择器发送到此对象吗?在这种情况下,我得到一个无效的选择器错误,但在过去,当我尝试这个时,我没有
UIView
没有这些方法。记住,在一天结束时,对象不能只是神奇地将类更改为子类。无论您告诉编译器什么,它仍然是一个
ui视图。它会崩溃的。您已经向编译器承诺该类实际上是一个
FooView
,但您所做的只是对它撒谎。我不确定我是否有这个想法。您需要什么:在运行时将基本UIView转换为FooView?或者只是一个投射指针?第一个是不可能的,要实现第二个,您必须简单地将MyViewController.view指向“FooView”类型的视图(即使插座被键入UIView)。当您指的是point The view ivar时,您指的是我上面所做的吗?是的。有时,您有一个基本类型的属性(或变量),但您知道实际的类型是不同的-这就是预期的铸造工作。但是当您收到意外的类型时,我假设controller.view中没有适当的对象。要按预期操作,它必须是FooView类型-检查XIB或构建控制器视图的代码。