1

I have a Container View that holds 1 of 3 view controllers swapped out by 3 tabs (across the bottom).

Here's my Storyboard:

enter image description here

I'm taking this approach so that I can have custom tabs and a single Save button for all the fields in this big form.

How can I access the IBOutlets in those 3 child view controllers from inside my Entry Detail View Controller class?

Here's what I've done to try and access it in the parent.

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

Then in my parent class (Entry Detail View Controller) I can't access the property:

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

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

How do I access another view controller's IBOutlets when they are in a Container View? Hopefully I'm on the right track. Forgive me as I'm still quite new to Objective-C. :)

4

4 回答 4

2

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

于 2013-05-14T00:49:54.293 回答
1

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

于 2013-05-14T00:59:16.720 回答
1

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

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

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

希望对一些人有所帮助。

于 2013-05-14T04:19:32.840 回答
0

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

self.entryFlightInfoViewController.aircraftIdTextField

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

于 2013-05-13T22:56:31.277 回答