UIContainerView内的UITextField表单在文本存在时返回nil

时间:2015-07-12 20:11:24

标签: ios objective-c uitableview uitextfield uicontainerview

层次结构:NavigationController(Root) - > SignupViewController(第二级) - > SignupTableView(第3级)。 SignupViewController包含一个嵌入SignupTableView的ContainerView。 SignupTableView包含您在图像中看到的字段。

我定义

    @property (nonatomic,strong) SignupTableViewController *tableViewController and
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([[segue identifier] isEqualToString:@"signupFieldSegue"]){

    SignupTableViewController *destination = (SignupTableViewController *)segue.destinationViewController;
    self.tableViewController = destination;
    }

}

在SingupTableView中。

内部按下IBAction按钮可验证UITableViewUIContainerView内的字段,但UITextFieldSignupTableViewController返回的值为nil。我尝试了self.tableViewController.usernameField.text并定义了

- (NSString *)getUsername {
     return _usernameField.text;
}

当文本存在时,两个解决方案都返回nil。有权访问该文本吗?

Screen Image

1 个答案:

答案 0 :(得分:0)

根据您在问题中所写的内容,您的容器视图似乎与主(父)视图控制器共享屏幕。无论如何,首先需要确保在包含表单的视图控制器被解除分配之前执行验证方法。

在您的父视图控制器中,您应该保留对segue的目标视图控制器的引用。这样,来自父视图控制器的验证可以轻松地从容器视图中的视图控制器中检索数据。

首先,在父视图控制器中声明一个属性:

@property (nonatomic, weak) FormViewController *formViewController;

然后,在prepareForSegue:sender:中,将该属性设置为segue的目标视图控制器。

- (void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id)sender {

    if ([segue.identifier isEqualToString:@"signupFieldSegue"]) {
        FormViewController *destination = (FormViewController *)segue.destinationViewController;
        self.formViewController = destination;

        // continue preparing for the segue...
    }
}

然后,在验证方法中,使用该属性访问UITextField值。以下是使用getUsername方法的示例,假设FormViewController具有usernameField属性:

- (NSString *)getUsername {
    return self.formViewController.usernameField.text;
}

同样,请记住,如果在尝试访问其文本字段之前取消分配表单视图控制器,则这些都不会起作用。