UIStoryboard容器将IBOutlet附加到父ViewController
我想使用一个UITableView
其中包含静态单元格与UITextField
里面附加到我的LoginViewController
。 我已经在头文件中添加了与故事板中的UITextFields
相对应的IBOutlets
。 不幸的是Xcode不允许UITableView
静态内容,你需要使用UITableViewController
。
因此,我从故事板中分离出了UITableView
,并使用了一个ContainerView
来embedded一个效果很好的UITableViewController
。 附上设置的屏幕截图。
我现在面临的问题是我无法链接UITextFields
到我的LoginViewController
,你可以从我的截图中看到,我已经添加了一个Object
到UITableViewController
,我已经设置到我的LoginViewController
并设法将UITextFields
链接到它。 但是,当主视图加载它说我的UITextFields
是nil
如何将我的UITextFields
链接到我的LoginViewController
IBOutlets
?
编辑:如果我必须UITableViewController
它看起来像我应该只使用原型单元格…任何其他的build议?
1.)将您的embed 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
,但这并不重要)):
@property (nonatomic) UITextField *firstNameField; @property (nonatomic) UITextField *usernameField; @property (nonatomic) UITextField *emailField; @property (nonatomic) UITextField *passwordField;
5.)在LoginViewController
的prepareForSegue: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.)你现在应该可以访问LoginViewController
的viewDidLoad
方法中的文本字段。
由于在项目进展,我已经了解到,最好不要使用静态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 ^