Ios 从TabBarController最佳实践获取ViewController

Ios 从TabBarController最佳实践获取ViewController,ios,objective-c,uiviewcontroller,uitabbarcontroller,Ios,Objective C,Uiviewcontroller,Uitabbarcontroller,我正在开发一个汽车应用程序。 我有一个链接到不同视图控制器的选项卡栏(CarInfo ViewController就是其中之一) 我使用以下方式将数据传递给其中一个视图控制器 CarInfoViewController *myCarInfoController = [self.tabBarController.viewControllers objectAtIndex:2]; [myCarInfoController setSearchParam:vin]; 我想知道使用objectAtIn

我正在开发一个汽车应用程序。 我有一个链接到不同视图控制器的选项卡栏(CarInfo ViewController就是其中之一)

我使用以下方式将数据传递给其中一个视图控制器

CarInfoViewController *myCarInfoController =  [self.tabBarController.viewControllers objectAtIndex:2];
[myCarInfoController setSearchParam:vin];
我想知道使用objectAtIndex直接从选项卡栏获取视图控制器与执行以下操作之间的区别:

CarInfoViewController *myCarInfoController = [[CarInfoViewController alloc] init];
[myCarInfoController setSearchParam:vin];

两种方法都有效!我很想知道在这种情况下,什么是最好的做法。

我怀疑这两种做法是否都能奏效。 当然,除非以编程方式创建视图控制器,并且正是您创建的
mycarinfo控制器
对象,然后将其添加到选项卡栏控制器中

使用第一条语句,您将从选项卡栏接收控制器。这很可能是在Interface Builder或Storyboard Editor中分别创建的控制器。对于该视图控制器,您知道它位于选项卡3(索引2)中


您的第二条语句为您的
carinfo视图控制器
分配了一个全新的实例。假设之前已经创建了一个(在IB或其他版本中)并作为第三个控制器驻留在选项卡栏控制器中,那么您有两个相同类的INTANCE,它们彼此不相关。如果您知道将任何数据传递给
mycarinfo控制器
(变量2),那么在选项卡栏控制器实际使用的实例中/不会发生任何事情

我怀疑这两种方法是否都有效。 当然,除非以编程方式创建视图控制器,并且正是您创建的
mycarinfo控制器
对象,然后将其添加到选项卡栏控制器中

使用第一条语句,您将从选项卡栏接收控制器。这很可能是在Interface Builder或Storyboard Editor中分别创建的控制器。对于该视图控制器,您知道它位于选项卡3(索引2)中


您的第二条语句为您的
carinfo视图控制器
分配了一个全新的实例。假设之前已经创建了一个(在IB或其他版本中)并作为第三个控制器驻留在选项卡栏控制器中,那么您有两个相同类的INTANCE,它们彼此不相关。如果您知道将任何数据传递给
mycarinfo控制器
(变量2),那么在选项卡栏控制器实际使用的实例中/不会发生任何事情

我怀疑这两种方法是否都有效。 当然,除非以编程方式创建视图控制器,并且正是您创建的
mycarinfo控制器
对象,然后将其添加到选项卡栏控制器中

使用第一条语句,您将从选项卡栏接收控制器。这很可能是在Interface Builder或Storyboard Editor中分别创建的控制器。对于该视图控制器,您知道它位于选项卡3(索引2)中


您的第二条语句为您的
carinfo视图控制器
分配了一个全新的实例。假设之前已经创建了一个(在IB或其他版本中)并作为第三个控制器驻留在选项卡栏控制器中,那么您有两个相同类的INTANCE,它们彼此不相关。如果您知道将任何数据传递给
mycarinfo控制器
(变量2),那么在选项卡栏控制器实际使用的实例中/不会发生任何事情

我怀疑这两种方法是否都有效。 当然,除非以编程方式创建视图控制器,并且正是您创建的
mycarinfo控制器
对象,然后将其添加到选项卡栏控制器中

使用第一条语句,您将从选项卡栏接收控制器。这很可能是在Interface Builder或Storyboard Editor中分别创建的控制器。对于该视图控制器,您知道它位于选项卡3(索引2)中


您的第二条语句为您的
carinfo视图控制器
分配了一个全新的实例。假设之前已经创建了一个(在IB或其他版本中)并作为第三个控制器驻留在选项卡栏控制器中,那么您有两个相同类的INTANCE,它们彼此不相关。如果您知道将任何数据传递给
mycarinfo控制器
(变量2),那么在选项卡栏控制器实际使用的实例中/不会发生任何事情

最佳实践取决于实际创建选项卡栏控制器的方式。这三种方式(参考我的答案)都是完全“合法”的,各有优缺点,每一种都可能是你的正确选择。从这里我们可以讨论访问单个视图控制器以向其传递数据的最佳实践。另外,您应该解释在什么情况下需要传递数据。可能有更聪明的方法来控制视图控制器并设置其属性。但这在很大程度上取决于你所处的具体情况。@HermannKlecker谢谢!我正在以编程方式创建视图控制器,但不确定该走哪条路。但是你的回答让我很好地理解了。很好,当您以编程方式创建它时,我建议保存一个引用(App Delegate中的属性或常规实例变量,或者方法中的局部变量(如果仅在方法中使用),MyCarInfo Controller已经是一个局部变量。只需保留参考资料供以后使用。那么,您就不必依赖于感兴趣的视图控制器正是选项卡栏结构中的第三个视图控制器了。@HermannKlecker这真是个好主意!这就是为什么我考虑第二种方法,这样我就不必依赖于视图控制器处于索引2。丹克!最佳实践取决于实际创建选项卡栏控制器的方式。这三种方式(参考我的答案)都是完全“合法”的,并且都有自己的特点