Ios 访问另一个视图控制器';位于容器视图中的IBS插座

Ios 访问另一个视图控制器';位于容器视图中的IBS插座,ios,objective-c,container-view,Ios,Objective C,Container View,我有一个容器视图,其中有三个视图控制器中的一个被三个选项卡(在底部)调出 这是我的故事板: 我采用这种方法,这样我就可以为这个大表单中的所有字段定制选项卡和一个保存按钮 如何从我的入口详细视图控制器类中访问这3个子视图控制器中的IBOutlet 下面是我在父目录中尝试访问它所做的工作 //EntryFlightInfoViewController.h (Child 1) @property (strong, nonatomic) IBOutlet UITextField *aircraftId

我有一个容器视图,其中有三个视图控制器中的一个被三个选项卡(在底部)调出

这是我的故事板:

我采用这种方法,这样我就可以为这个大表单中的所有字段定制选项卡和一个保存按钮

如何从我的入口详细视图控制器类中访问这3个子视图控制器中的IBOutlet

下面是我在父目录中尝试访问它所做的工作

//EntryFlightInfoViewController.h (Child 1)
@property (strong, nonatomic) IBOutlet UITextField *aircraftIdTextField;
然后在父类(条目详细视图控制器)中,我无法访问属性:

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

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

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

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

self.entryFlightInfoViewController.aircraftIdTextField

通过尝试使用
\u aircraftIdTextField
您可以尝试直接访问容器视图控制器类上的实例变量。显然,如果没有具有该名称的变量,则会出现编译错误。

您需要对当前选项卡视图控制器的引用,然后向其请求出口:

self.entryFlightInfoViewController.aircraftIdTextField

通过尝试使用
\u aircraftIdTextField
您可以尝试直接访问容器视图控制器类上的实例变量。显然,if没有具有该名称的变量,因此会出现编译错误。

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

Clifton,只要有可能,您应该避免让VCs知道彼此的控件。您可以让save按钮发送一条消息,并让三个下属VCs观察消息。当他们收到信息时,他们会保存自己的信息。这样,主VC就不必了解下属内部的控制

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

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

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

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


希望这对你有所帮助。

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

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

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


希望这能有所帮助。

我猜您指的是NSNotification。对吗?我从来没用过。因此,如果我将其连接起来,每个视图控制器是否会在其自己的UITextFields中保留这些值,即使它们当前未加载到容器视图中?选项卡切换三个视图控制器中的一个。我假设您指的是NSNotification。对吗?我从来没用过。因此,如果我将其连接起来,每个视图控制器是否会在其自己的UITextFields中保留这些值,即使它们当前未加载到容器视图中?选项卡切换三个视图控制器中的一个。让控制器知道它的子视图的工作方式对我来说似乎很奇怪。我会有一个单独的对象(NSManageObject、NSDictionary等),它保存详细信息条目的所有值;飞机Id、仪器、签名等。然后,当加载详细信息条目子视图控制器时,我将传入该对象。然后子视图控制器将更新该对象中的值。让控制器知道其子对象的工作方式对我来说似乎很奇怪。我会有一个单独的对象(NSManageObject、NSDictionary等),它保存详细信息条目的所有值;飞机Id、仪器、签名等,然后在加载详细信息输入子视图控制器时