这可能是非常容易实现的事情,但我是 iOS 编程新手,而且我似乎陷入了困境。
所以,基本上,我有一个选项卡式应用程序。我决定除了标签栏之外还需要一个导航栏。为此,我放置了选项卡栏控制器,然后添加了视图控制器并嵌入到每个视图控制器的导航控制器中,然后将其连接到选项卡栏。
我在故事板中的层次结构看起来有点像这样:
- View Controller
- Tab Bar Controller
- Navigation Controller
- 视图控制器
- Navigation Controller
- 视图控制器
我被困在这里的部分是当尝试将数据从第一个视图控制器传递到任何其他视图控制器时。在添加导航控制器之前,我使用prepareForSegue方法来传递数据,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"logged"])
{
UITabBarController *tabar=segue.destinationViewController;
SecondViewController *svc=[tabar.viewControllers objectAtIndex:1];
svc.groupArray = [(NSArray*)sender objectAtIndex:0];
svc.userArray = [(NSArray*)sender objectAtIndex:1];
svc.taskArray = [(NSMutableArray*)sender objectAtIndex:2];
svc.selfArray = [(NSMutableArray*)sender objectAtIndex:3];
[tabar setSelectedIndex:1];
}
}
正如您所看到的,我将数据传递到第二个视图控制器,并使用 PerformSegueWithIdentifier 方法将选项卡栏索引设置为 1,因为我希望打开第二个页面。所有这些都工作得很好,直到我将导航控制器引入到我的代码中,因为我想要导航栏。那时一切都崩溃了。如果我尝试按原样运行代码,应用程序将崩溃并在控制台中显示以下输出:
[UINavigationController setGroupArray:]:发送到的无法识别的选择器
实例0x7ffa6acec620
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UINavigationController setGroupArray:]:无法识别的选择器发送到实例 0x7ffa6acec620”
我尝试过稍微修改一下代码,但似乎没有任何效果。我只是很困惑,也许正确方向的提示会对我有所帮助。
由于您将视图控制器嵌入到导航控制器中,因此它们不再是选项卡栏的直接子级;但是,您将选项卡栏控制器的子级强制转换为导航控制器以外的其他控制器。您想要首先获取导航控制器(它是选项卡栏控制器的子级),然后获取该导航控制器的子级。这将是您的视图控制器。然后您可以为此设置数据。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"logged"])
{
UITabBarController *tabar=segue.destinationViewController;
UINavigationController *navController = [tabbar.viewControllers objectAtIndex:1];
SecondViewController *svc=[navController.viewControllers objectAtIndex:0];
svc.groupArray = [(NSArray*)sender objectAtIndex:0];
svc.userArray = [(NSArray*)sender objectAtIndex:1];
svc.taskArray = [(NSMutableArray*)sender objectAtIndex:2];
svc.selfArray = [(NSMutableArray*)sender objectAtIndex:3];
[tabar setSelectedIndex:1];
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)