发送嵌套消息时正确转换

时间:2014-05-02 15:04:45

标签: ios objective-c casting

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

NSString *text = [((UITextField *)[[childViewController view]viewWithTag:0])text];

似乎与Xcode一样好。 但是,只要应用程序运行并且方法被调用,我就会得到一个uncaught exception 'NSInvalidArgumentException', reason: '-[UIView text]: unrecognized selector sent to instance 0x89763f0'我认为我投射到UITextField的方式有问题。
我已经尝试了其他几种方法来实现这一点,但是他们总是在Xcode中给我错误,所以我想这是我得到的最接近解决方案。
有人知道如何正确演绎吗?
谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

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

UITextField

我建议标记UITextField *textField = [[childViewController view] viewWithTag:0]; NSAssert([textField isKindOfClass:[UITextField class]], @"Oh no! I was wrong"); NSString *text = textField.text; 是一个错误的数字,因为这是默认(未设置)值,我希望断言 fire

答案 1 :(得分:0)

这与演员无关。

实际上是标签值。默认标记值为0,因此如果你喜欢它,它将不会给出UITextField。它可以为您提供不会设置标记的任何视图。

答案 2 :(得分:0)

以下代码应该适合您。

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

但是,如果要经常访问视图的特定子视图,则应将其标记设置为其他回复中建议的唯一值。