【问题标题】:Accessing another View Controller's IBOutlets Housed in a Container View访问容器视图中的另一个视图控制器的 IBOutlets
【发布时间】:2013-05-13 22:49:47
【问题描述】:

我有一个 Container View,其中包含 3 个视图控制器中的 1 个被 3 个选项卡(在底部)换出。

这是我的故事板:

我正在采用这种方法,以便我可以为这个大表单中的所有字段设置自定义选项卡和一个保存按钮。

如何从我的 Entry Detail View Controller 类中访问这 3 个子视图控制器中的 IBOutlets?

这是我为尝试在父级中访问它所做的工作。

//EntryFlightInfoViewController.h (Child 1)
@property (strong, nonatomic) IBOutlet UITextField *aircraftIdTextField;

然后在我的父类(Entry Detail View Controller)中我无法访问该属性:

//EntryDetailViewController.m (Parent)
#import "PPEntryFlightInfoViewController.h"

- (IBAction)buttonSave:(id)sender {
  NSLog(@"save: %@", _aircraftIdTextField); //(!) Error: Use of undeclared identifier '_aircraftIdTextField'
}

当另一个视图控制器的 IBOutlets 位于容器视图中时,我如何访问它们?希望我走在正确的轨道上。请原谅我,因为我对 Objective-C 还是很陌生。 :)

【问题讨论】:

  • 让控制器知道它的孩子的工作对我来说似乎很时髦。我会有一个单独的对象(NSManageObject、NSDictionary 等),它包含您的详细信息条目的所有值。 ;飞机 ID、仪器、签名等。然后,当您加载详细条目子视图控制器时,我将传入该对象。然后子视图控制器将更新该对象中的值。

标签: ios objective-c container-view


【解决方案1】:

容器视图中的视图控制器是具有容器视图的控制器的子级。因此,您可以使用 self.childViewControllers[0] 访问当前子视图控制器,并使用 [self.childViewControllers[0] aircraftIdTextField] 访问出口

【讨论】:

  • 我认为容器视图的这种方法没有任何问题。为什么要跳过其他一些答案中使用的圈套?
【解决方案2】:

简短的回答是,除非您编写自己的通信层,否则您不能。您可以通过 childViewControllers(如上所述)获得不同的视图,也可以在视图加载到容器视图中时在您的 prepareForSegue 方法调用中获取您自己的自定义指针。 (请参阅this link 了解更多信息)如果您强制用户访问每个页面,这将非常有用。如果不是,那么您在第一个 viewDidLoad 上加载的默认值可能会被保存,而无需检查特定的视图控制器。

Apple 的答案是永远不会有保存按钮。如果您编辑它,您就是认真的,它会立即保存。 =)

也就是说,如果我是你,我会有一个对象,当你显示/隐藏不同的视图时,所有视图都可以访问以加载/卸载它们的数据以进行存储,可能在 viewDidLoad/viewDidDisappear 中。这样一来,您始终可以准备好保存“已知良好”的对象,而不必直接访问这些视图控制器。

希望对一些人有所帮助。

【讨论】:

  • 经过进一步研究,我得出了与您介绍的相同的结论。我需要将每个子视图的字段保存在 NSManagedObjectContext 中(我正在使用 Magical Record 和 Core Data)。在viewDidDisappear 上,我将所有字段保存到对象中,然后在用户点击保存时保存到数据库中。谢谢!
  • 你打赌。我通过犹他州移动开发人员的 FB 页面找到了这个问题,很高兴我能提供帮助。 =)
【解决方案3】:

克利夫顿,您应该尽可能避免让 VC 了解彼此的控制权。你可以让保存按钮发出一条消息,并让三个下级 VC 观察它。当他们收到消息时,他们会保存他们的信息。这样,主 VC 就不必知道其下属内部的控制。

【讨论】:

  • 我假设您指的是 NSNotification。那是对的吗?我从来没有使用过它。因此,如果我将其连接起来,每个视图控制器是否会保留其自己的 UITextFields 中的值,即使它们当前未加载到容器视图中?选项卡切换三个视图控制器之一。
【解决方案4】:

您需要对当前选项卡视图控制器的引用,然后向它询问插座:

self.entryFlightInfoViewController.aircraftIdTextField

通过尝试使用_aircraftIdTextField,您尝试直接访问容器视图控制器类上的实例变量。显然,如果没有具有该名称的变量,因此您会收到编译错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多