如何修改故事板创建的视图控制器?

Posted

技术标签:

【中文标题】如何修改故事板创建的视图控制器?【英文标题】:How to modify view controller created by storyboard? 【发布时间】:2013-11-28 06:46:48 【问题描述】:

我使用带有 5 个不同选项卡的情节提要在 Xcode 5 中创建了一个选项卡式应用程序。

现在我想访问第五个视图控制器来务实地修改一些字段,所以我希望访问故事板自动创建的视图控制器。

我已经给视图控制器一个标识符,在我的 viewDidLoad 方法中,我使用了以下代码

UIStoryboard *mainStoryboard = [self storyboard];
ProfileViewController *controller = [mainStoryboard instantiateViewControllerWithIdentifier: @"loginviewcontroller"];
[controller setFields:PFLogInFieldsFacebook | PFLogInFieldsDefault];
[self presentViewController:controller animated:YES completion:nil];

但显然一个新的视图控制器被创建并呈现在由故事板自动创建的原始视图控制器实例的顶部,并且标签栏导航也消失了。

如何自动访问由情节提要创建的视图控制器,否则这是错误的方法?如果这是错误的方法,我该如何完成这项任务?

【问题讨论】:

【参考方案1】:

您可以通过标签栏控制器访问它。从嵌入标签栏控制器的任何控制器中,您都可以获得这样的参考:

UIViewController *controller = self.tabBarController.viewControllers[4];

要设置字段,而不是尝试从另一个控制器设置它们,只需传递 #5 控制器需要自己执行此操作的数据。由于#5 的视图在第一次查看之前不会被加载,因此您不能从另一个控制器修改它的视图。因此,在 ProfileViewController 中,创建整数属性,我们将其称为 fieldValues,并将数据传递给它。在您要传递信息的控制器中:

ProfileViewController *controller = self.tabBarController.viewControllers[4];
controller.fieldValues = PFLogInFieldsFacebook | PFLogInFieldsDefault;

然后在 ProfileViewController 的 viewDiLoad 中,这样做:

[self setFields:self.fieldValue];

【讨论】:

嗨,我已经按照这种方法访问视图控制器,但奇怪的是我无法从该视图控制器更改视图。 (未反映在模拟器上)。我需要执行什么额外的步骤吗? @Bob,可能是因为该控制器视图尚未加载。当一个标签栏控制器被实例化时,它的所有内容控制器也被实例化,但只有第一个标签中的控制器有它的 viewDidLoad 被调用。您可以将数据传递给控制器​​ #5,并让它在 viewDidLoad 或 viewDidAppear 中更改其视图。 @Bob,我已经编辑了我的答案,以向您展示我传递数据的意思。 我在上面尝试了你的代码,但它给了我错误消息“在'ProfileViewController *'类型的对象上找不到属性'fieldValue'”。但相反,我把这两行代码“ProfileViewController *controller = self.tabBarController.viewControllers[4];[controller setFields:PFLogInFieldsFacebook | PFLogInFieldsDefault];”在我的第一个选项卡的 ViewDidLoad 方法下,它可以正常工作——它改变了我的第五个选项卡视图的字段。知道为什么会这样吗? PS:你可能注意到了,我正在使用解析框架。 @Bob,您收到该错误是因为您没有将该属性添加到 ProfileViewController 的 .h 文件中。我对Parse不熟悉,但肯定是字段只是控制器的一个属性,所以你可以从外面设置它(也就是说,它不是设置UI元素的值,而是一个属性,这是我试图用我的答案做什么)。【参考方案2】:

不要展示您的视图控制器,因为您的视图控制器已经是标签栏的一部分。所以使用以下代码选择它:

[self.tabBarController setSelectedIndex:yourIndex];

你的代码应该是这样的:

UIViewController *controller = self.tabBarController.viewControllers[4];
[controller setFields:PFLogInFieldsFacebook | PFLogInFieldsDefault];
[self.tabBarController setSelectedIndex:4];

享受:)

【讨论】:

嗨,它看起来很有希望,但是当我尝试这个时,“视图”没有更新。如您所见,我正在尝试将“PFLogInFieldsFacebook”字段添加到“视图”,但未显示该字段。 :( 有没有关于为什么会发生这种情况的想法?【参考方案3】:

来自 Apple 文档 关于instanceViewControllerWithIdentifier:

You use this method to create view controller objects that you want to manipulate and present programmatically in your application. Before you can use this method to retrieve a view controller, you must explicitly tag it with an appropriate identifier string in Interface Builder.

【讨论】:

您不能将 NSString("loginviewcontroller") 分配给标签 (NSInteger) 值 嗨,我很困惑,它说“用适当的标识符字符串标记它”,但我为什么要给它一个 NSInteger 值?

以上是关于如何修改故事板创建的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个故事板uiviewcontroller为多个子类

如何在标题视图 iOS 中创建故事板布局多个视图?

当多个tableViewControllers(没有故事板)时如何pushViewController

将故事板添加到现有项目

何时为新屏幕创建新的故事板与视图控制器?

如何回到不同故事板的先前视图控制器?