繁体   English   中英

将信息从UINavigationController传递到嵌入式UIViewController

[英]Passing info from UINavigationController to embedded UIViewController

概要

由于我没有按照我的意图让我的应用程序传递数据的方式,我将首先提出以下问题:

  • 通常,如何将数据从导航控制器传递到其嵌入式View Controller?
  • 具体来说,导航控制器中的prepareForSegue方法是否会被调用? 如果是这样,怎么样?

安装程序

我有以下内容:

  • 一个名为查看 用户视图控制器
    链接到自定义类JRMUserViewController (扩展UIViewController )。
    这个观点嵌入:
  • 导航搜索标题为导航到用户视图
    链接到自定义类JRMNavigationToUserViewController (扩展UINavigationController )。

    重要的提示:
    首先,我没有在导航控制器中嵌入用户视图控制器。 导航控制器及其链接的类不存在。

  • 一个标题为Issue Table View Controller的表视图
    链接到自定义类JRMIssuesTableViewController (扩展UITableViewController )。
  • 一个链接到Modal Segue的 按钮 ,进入Navigaton To User View
    Segue由文本“ IssuesToUserView ”标识。

StoryBoard设置

预期的功能

我的想法是,当我在问题表视图控制器上时 ,我可以点击按钮,它会将我带到用户视图控制器 ,在那里我将看到当前用户的头像,以及一个包含当前用户全名的标签。

为了实现这一点(在我将导航控制器中的用户视图控制器嵌入之前),我将数据从JRMIssuesTableViewController传递到前者的prepareForSegue方法中的JRMUserViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"\nSEGUE IDENTIFIER:\n%@", [segue identifier]);
    if([[segue identifier] isEqualToString:@"IssuesToUserView"]) {
        JRMUserViewController *vc = [segue destinationViewController];
        vc.currentUser = self.currentUser;
        NSURL *url = [[NSURL alloc] initWithString:[vc.currentUser.avatarUrls objectForKey:@"48x48"]];
        NSLog(@"\nURL:\n%@", url);
        NSData *data = [NSData dataWithContentsOfURL:url];
        [vc.view addSubview:vc.avatar];
        [vc.avatar setImage:[[UIImage alloc] initWithData:data]];
        vc.userLabel.text = vc.currentUser.displayName;    
   }
}

它奏效了。 单击第一个视图上的按钮将我带到第二个视图,其中显示了当前用户的信息:

问题表视图

用户视图 - 工作

意外行为

在此之后,出于必要 ,我不得不在前面提到的导航控制器中嵌入用户视图控制器 当然,在执行此操作之后,我在运行时遇到了未被捕获的异常,因为在我重写的prepareForSegue中,我正在向导航控制器而不是用户视图控制器发送消息。 为了解决这个问题,我扩展了UINavigationController ,将其命名为JRMNavigationToUserViewController ,并将导航视图链接到它,正如我在设置中提到的那样。

然后,在进入嵌入式View之前,确定UINavigationController会调用自己的prepareForSegue ,我覆盖了JRMNavigationToUserViewControllerprepareForSegue方法:

- (id)passValuesToDesitinationOfSegue:(UIStoryboardSegue *)segue {
    NSLog(@"Calling [JRMNavigationToUserViewController passValuesToDestinationOfSegue]");
    JRMUserViewController *destination = [segue destinationViewController];
    destination.server = self.server;
    destination.currentUser = self.currentUser;
    destination.avatar = self.avatar;
    [destination.view addSubview:destination.avatar];
    destination.userLabel = self.userLabel;
    return destination;
}

#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"Calling [JRMNavigationToUserViewController prepareForSegue]");
    [self passValuesToDesitinationOfSegue:segue];
}

这次,当我点击按钮时, 用户视图控制器没有收到数据。 它看起来像这样:

用户视图 - 不工作

显然,从未调用过JRMNavigationToUserViewControllerprepareForSegue方法,因为它会记录消息:

Calling [JRMNavigationToUserViewController prepareForSegue]
Calling [JRMNavigationToUserViewController passValuesToDestinationOfSegue]

我无法在控制台的任何位置找到这些线条。

摘要

这又是我的问题:

  • 通常,如何将数据从导航控制器传递到其嵌入式View Controller?
  • 具体来说,导航控制器中的prepareForSegue方法是否会被调用? 如果是这样,怎么样?

你在这里滥用UINavigationController 看看你的故事板:你有一个表控制器,它以某种方式呈现一个导航控制器,而后者又有一个用户控制器作为其根控制器。 我想你想要的是让导航控制器包含表控制器,并在表上点击触发推送到用户视图控制器的segue。 因此,导航控制器应位于左侧,中间的表控制器和右侧的用户控制器。

然后,将编写表控制器中的-prepareForSegue:sender:方法,使其查看所选单元格并设置用户控制器的相应属性(即segue的目标)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM