Ios 发送嵌套消息时正确强制转换

Ios 发送嵌套消息时正确强制转换,ios,objective-c,casting,Ios,Objective C,Casting,从childViewController获取UITextView的文本属性,如下所示: NSString *text = [((UITextField *)[[childViewController view]viewWithTag:0])text]; 似乎可以使用Xcode。 但是,只要应用程序运行并调用该方法,我就会得到一个未捕获的异常'NSInvalidArgumentException',原因:'-[UIView text]:未识别的选择器发送到实例0x89763f0'我想我转换到UI

从childViewController获取
UITextView
的文本属性,如下所示:

NSString *text = [((UITextField *)[[childViewController view]viewWithTag:0])text];
似乎可以使用Xcode。 但是,只要应用程序运行并调用该方法,我就会得到一个
未捕获的异常'NSInvalidArgumentException',原因:'-[UIView text]:未识别的选择器发送到实例0x89763f0'
我想我转换到
UITextField的方式有问题

我已经尝试了其他几种方法来强制转换这个问题,但它们总是在Xcode中给我错误,所以我想这是我得到的最接近解决方案。
有人知道如何正确地投下这个吗?

谢谢你的帮助

这与铸造无关


它实际上与标记值有关。默认标记值是0,所以如果您这样做,它不会给出UITextField。它可以提供您不设置标记的任何视图。

除了难以阅读(因此难以维护)之外,代码没有任何问题,但是您需要添加一些检查,以查看您认为是
UITextField
的视图实际上是否是一个:

UITextField *textField = [[childViewController view] viewWithTag:0];
NSAssert([textField isKindOfClass:[UITextField class]], @"Oh no! I was wrong");
NSString *text = textField.text;

我建议选择标记
0
是一个错误的数字,因为这是默认(未设置)值,我希望该断言会触发。

对于您的代码,以下内容应该适用于您

NSString *text = nil;
for (id subview in [childViewController view] subviews]){
    if ([subview isKindOfClass:[UITextField class]]){
        text = [(UITextField*)subview text];
        break;
    }
}

但是,如果要频繁访问视图的特定子视图,它们的标记也应设置为其他答复中建议的唯一值。

谢谢您的快速回答!是的,事实上,这与演员阵容无关。我搞乱了标签,所以每次调用该方法时,我都会得到一个不同的视图。。。因此,使用标记来识别视图对象是一种相当不可靠的方法(如果您在设置它们时不是非常谨慎的话)。有没有其他选择,比如给他们一个单独的名字?你应该定义你感兴趣的视图(一般意义上,即文本字段、按钮、标签等),作为视图控制器上的IBOutlet属性在代码中访问。啊,你是说通过标签访问视图会暴露出应用程序结构方面的潜在设计问题吗?