UIStoryboard容器将IBOutlet附加到父ViewController

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

因此,我从故事板中分离出了UITableView ,并使用了一个ContainerView来embedded一个效果很好的UITableViewController 。 附上设置的屏幕截图。

当前故事板设置

我现在面临的问题是我无法链接UITextFields到我的LoginViewController ,你可以从我的截图中看到,我已经添加了一个ObjectUITableViewController ,我已经设置到我的LoginViewController并设法将UITextFields链接到它。 但是,当主视图加载它说我的UITextFieldsnil

如何将我的UITextFields链接到我的LoginViewController IBOutlets

编辑:如果我必须UITableViewController它看起来像我应该只使用原型单元格…任何其他的build议?

1.)将您的embed segue命名为“TextFields”

2.)如果你还没有,子类UITableViewController并设置你的表视图控制器到故事板中的这个类。 我们称之为TextFieldsTableViewController

3.)再一次,如果你还没有,为你的文本字段添加IBOutletTextFieldsTableViewController的公共接口:

 @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 ,但这并不重要)):

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

5.)在LoginViewControllerprepareForSegue:sender:方法中,在强制立即加载表视图控制器的视图之后,将TextFieldsTableViewController的文本字段映射到self的文本字段:

 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; } 

6.)你现在应该可以访问LoginViewControllerviewDidLoad方法中的文本字段。

由于在项目进展,我已经了解到,最好不要使用静态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 ^