层次结构: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按钮可验证UITableView
内UIContainerView
内的字段,但UITextField
内SignupTableViewController
返回的值为nil。我尝试了self.tableViewController.usernameField.text
并定义了
- (NSString *)getUsername {
return _usernameField.text;
}
当文本存在时,两个解决方案都返回nil。有权访问该文本吗?
答案 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;
}
同样,请记住,如果在尝试访问其文本字段之前取消分配表单视图控制器,则这些都不会起作用。