ios - UITableView 在嵌入容器内部的 Controller 之间传递数据

标签 ios objective-c uitableview storyboard

我有一个简单的测试项目。嵌入在 Storyboard 中的导航 Controller 中的 UITableViewController (MasterViewController)。我没有使用 prepareForSegue 将数据传递给另一个 View Controller (DetailViewController)。相反,didSelectRowAtIndexPath 用于更新 detailviewcontroller 中的标签,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
    NSMutableString *object = thisArray[indexPath.row];

    detailViewController.passedData = object;
    [self.navigationController pushViewController:detailViewController animated:YES];
}

到目前为止一切正常。

现在我在 Storyboard中添加了另一个 View Controller 。使它成为初始 View Controller ,在其中添加两个容器,然后将 MasterViewController 和 DetailViewContainer 嵌入到这些容器中。

现在不再在右侧的 DetailViewController 中显示传递的数据,而是通过替换 Controller View 在左侧显示传递的数据。

如果我无法阐明我想说的是什么,这里是项目的链接 https://jumpshare.com/v/UiTFEB6AamIo8qX9sinW ,仅供学习。

谢谢

最佳答案

你遇到这个问题是因为你还在这样做:

[self.navigationController pushViewController:detailViewController animated:YES];

您在此处引用的导航 Controller 是您的主 Controller 嵌入其中的那个,因此您创建一个 detailController 实例(不同于屏幕上已有的实例)并将其推送到导航 Controller 上。

您想要做的是获取对已在屏幕上的详细信息 Controller 的引用——两个 subview Controller (容器 View 中的 subview Controller )在应用程序启动时已经实例化。所以,你需要这样做:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    DetailViewController *detailViewController = [self.navigationController.parentViewController childViewControllers][1];
    NSMutableString *object = thisArray[indexPath.row];
    detailViewController.passedData = object;
}

这会将值传递给细节 Controller ,但是您无法在 viewDidLoad 中使用代码来更新标签,因为该 View 已经加载,并且不会再次调用。相反,覆盖 passedData 的 setter,并在那里更新标签(请注意,我将参数的名称更改为 passedInData,因此它不会与您的属性 passedData 冲突):

-(void)setPassedData:(NSString *)passedInData {
    passedData = passedInData;
    detailDescriptionLabel.text = passedData;
}

顺便说一下,除非您计划在主视图 Controller 之后添加其他 Controller ,否则没有理由将它嵌入到导航 Controller 中,鉴于此设置。如果你把它拿出来,那么你需要在获取到detail controller的引用时去掉self.navigationController的引用。它将只是:

DetailViewController *detailViewController = [self.parentViewController childViewControllers][1];

关于ios - UITableView 在嵌入容器内部的 Controller 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16381278/

相关文章:

iphone - 以编程方式为 ViewController 创建选项卡栏

ios - 如何获取特定 UITableViewCell 上方(或下方)的 TableView Cell

swift - 我的 tableview 突然停止滚动

ios - 将 cocoapods 引入协作 iOS 项目有哪些复杂之处?

objective-c - 运行错误将我发送到我没有写的代码

iphone - 从 CALayers 获取位图,renderInContext 的任何替代方法

objective-c - UIScrollView,分页和旋转 : Second view is not aligned properly after rotation

ios - Swift - 用户位置问题

objective-c - 从 View 中删除 UILabel 的问题

ios - UITableView 不响应 UITableViewCell 的选择