UIStoryboard容器将IBOutlet附加到父ViewController

时间:2014-05-27 13:31:22

标签: ios xcode storyboard iboutlet

我想使用一个UITableView,其中包含UITextField内部附加到LoginViewController的静态单元格。我在头文件中添加了IBOutlets,与故事板中的UITextFields对应。不幸的是,Xcode不允许UITableView内的静态内容使用UITableViewController

因此,我从故事板中拆分了UITableView并使用ContainerView嵌入UITableViewController,效果很好。附上设置的屏幕截图。

Current Storyboard Setup

我现在面临的问题是我无法将UITextFields与我的LoginViewController相关联,您可以从我的屏幕截图中看到我已向Object添加UITableViewController我已设置为LoginViewController并设法将UITextFields与其关联。但是当主视图加载时,我的UITextFieldsnil

如何将UITextFieldsIBOutlets中的LoginViewController关联起来?

编辑: 如果我必须继承UITableViewController,我似乎应该使用原型单元格...还有其他任何建议吗?

2 个答案:

答案 0 :(得分:3)

1。)将您的嵌入segue命名为“TextFields”

2。)如果还没有,请将UITableViewController子类化,并将故事板中的表视图控制器设置为此类。我们称之为TextFieldsTableViewController

3。)同样,如果您还没有,请将IBOutlet的文本字段添加到TextFieldsTableViewController的公共界面中:

@property (weak, nonatomic) IBOutlet UITextField *firstNameField;
@property (weak, nonatomic) IBOutlet UITextField *usernameField;
@property (weak, nonatomic) IBOutlet UITextField *emailField;
@property (weak, nonatomic) IBOutlet UITextField *passwordField;

4.。)将文本字段的属性添加到LoginViewController的公共界面中(请注意,与上述不同,这些属性并不弱(它们也不是IBOutlet s,但那不是'真的很重要)):

@property (nonatomic) UITextField *firstNameField;
@property (nonatomic) UITextField *usernameField;
@property (nonatomic) UITextField *emailField;
@property (nonatomic) UITextField *passwordField;

5.。)在LoginViewController的{​​{1}}方法中,在强制将表视图控制器的视图强制映射后,将prepareForSegue:sender:的文本字段映射到TextFieldsTableViewController的文本字段立即加载:

self

6。)您现在应该可以使用if ([segue.identifier isEqualToString:@"TextFields"]) { TextFieldsTableViewController *textFieldsVC = segue.destinationViewController; // IMPORTANT: This forces the view to load and the outlets to get set. // If you don't do this, textFieldsVC's IBOutlets will all be nil at this point. // This is slightly inelegant in my opinion, but it works. A better solution might // be to set the text fields in TextFieldsTableViewController's viewDidLoad method. [textFieldsVC view]; self.firstNameField = textFieldsVC.firstNameField; self.usernameField = textFieldsVC.usernameField; self.emailField = textFieldsVC.emailField; self.passwordField = textFieldsVC.passwordField; } 的{​​{1}}方法访问文本字段。

答案 1 :(得分:1)

自从项目进展以来,我已经了解到不使用静态UITableView看起来会更好,因为你可以快速进入这样的复杂问题。

如果您真的反对进行任何子类化,可以将其添加到viewDidAppear:方法中 - (因为UITableView没有在viewWillAppear:

加载任何单元格
[self.childViewControllers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    UIViewController *childViewController = obj;
    //Make sure we are using the correct view controller -
    if([childViewController.restorationIdentifier isEqualToString:@"LoginTableViewController"]){
        self.username = (UITextField *)[childViewController.view viewWithTag:-2];
        self.email = (UITextField *)[childViewController.view viewWithTag:-3];
        self.password = (UITextField *)[childViewController.view viewWithTag:-4];
    }
}];

请务必在Storyboard

中标记您的观看次数

w ^