我想使用一个UITableView
,其中包含UITextField
内部附加到LoginViewController
的静态单元格。我在头文件中添加了IBOutlets
,与故事板中的UITextFields
对应。不幸的是,Xcode不允许UITableView
内的静态内容使用UITableViewController
。
因此,我从故事板中拆分了UITableView
并使用ContainerView
嵌入UITableViewController
,效果很好。附上设置的屏幕截图。
我现在面临的问题是我无法将UITextFields
与我的LoginViewController
相关联,您可以从我的屏幕截图中看到我已向Object
添加UITableViewController
我已设置为LoginViewController
并设法将UITextFields
与其关联。但是当主视图加载时,我的UITextFields
为nil
如何将UITextFields
与IBOutlets
中的LoginViewController
关联起来?
编辑:
如果我必须继承UITableViewController
,我似乎应该使用原型单元格...还有其他任何建议吗?
答案 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 ^