【问题标题】:UIStoryboard Container Attach IBOutlet To Parent ViewControllerUIStoryboard 容器将 IBOutlet 附加到父 ViewController
【发布时间】:2014-07-16 10:45:29
【问题描述】:

我想使用一个UITableView,它包含一个静态单元格,里面有一个UITextField,连接到我的LoginViewController。我在与情节提要中的UITextFields 对应的头文件中添加了IBOutlets。不幸的是,Xcode 不允许在 UITableView 中使用静态内容,您需要使用 UITableViewController

因此,我从情节提要中分离出UITableView,并使用ContainerView 嵌入UITableViewController,效果很好。附上设置截图。

我现在面临的问题是我无法将UITextFields 链接到我的LoginViewController,您可以从我的屏幕截图中看到我已将Object 添加到我已设置为@987654336 的UITableViewController @ 并设法将UITextFields 链接到它。但是当主视图加载时,它说我的UITextFieldsnil

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

编辑: 如果我必须对UITableViewController 进行子类化,似乎我应该只使用原型单元......还有其他建议吗?

【问题讨论】:

    标签: ios xcode storyboard iboutlet


    【解决方案1】:

    1.) 将您的嵌入转场命名为“TextFields”

    2.) 如果您还没有,请将 UITableViewController 子类化并将您的表视图控制器设置为情节提要中的此类。我们就叫它TextFieldsTableViewController吧。

    3.) 同样,如果您还没有,请将您的文本字段的 IBOutlets 添加到 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 的公共界面中(请注意,与上述不同,这些属性并不弱(它们也不是 IBOutlets,但这并不重要) ):

    @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 方法中的文本字段。

    【讨论】:

    • 看起来这可以完成这项工作。很遗憾你必须继承 UITableViewController :S
    【解决方案2】:

    自从在项目中取得进展后,我了解到最好不要使用静态 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

    【讨论】:

      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2014-11-29
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多