在视图控制器之间传递数据/对象/moc - 最佳实践

2023-12-02

我有一个我怀疑很常见的场景,我发现了各种想法来回答其他类似的问题,包括设置 IBOutlet、将 NSmanagementobjects 作为属性传递以及仅使用一个视图控制器但交换视图,但我不确定这将是为我的解决方案实施的最佳想法。

我有一个具有典型模型的 iOS/iPhone 应用程序。 UITabBarController 包含多个 UINavigationController。

在其中一个导航控制器中,我有一个带有 tableView 的视图控制器。该 tableView 是从获取的核心数据实体(称为“标签”)填充的。当我使用 UIBarButtonItem (添加)设置 tableView 时,添加按钮需要表现如下:我需要它为该实体创建一个新的“标签”对象,并使用一些已知数据填充该对象,然后提示用户钻取向下3级分类(区域->区域->主题)以达到主题对象。然后,我需要将该“主题”对象添加到原始新添加的“标签”对象的关系中(堆栈中进一步向下的 3 个视图)。 -希望这是清楚的。

(有很多代码我不确定要呈现哪些位,所以我现在用主要片段进行描述,请务必让我知道您想查看的任何特定代码。)

- (void)addTag {    

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[newManagedObject setValue:@"(untitled)" forKey:@"tagID"];

NSError *error;
if (![context save:&error])
    NSLog(@"Error saving entity: %@", [error localizedDescription]);


ChooseRegion *aView = [[[ChooseRegion alloc] init] autorelease];
aView.theTag = newManagedObject;

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

}

您可以看到我已经创建了该对象,为其一个属性设置了一个值,保存了该对象并将该对象传递到下一个视图 (chooseRegion),这是 3 个视图中的第一个视图。每个 didSelectRowAtIndexPath 代码都会将选定的行和此“标记”对象传递到下一个视图,我不确定这是否正确,因为我不确定当我到达第三个视图上的主题对象时该怎么做? ??我迷路了。

给猫剥皮的方法总是不止一种,但我应该用什么方法来解决这个问题。我应该向前传递“标签”对象并将其保存在第三个视图中,还是传回所选主题并将其保存在创建“标签”对象的原始视图中?

提前谢谢了。


我会为此使用通知。通知是一种解耦应用程序各个部分的简单方法,但仍然让它们一起工作。

在您的情况下,当用户在第三个视图中选择标签对象时,我会发送这样的通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"tagSelected" object:myTag];

现在,在具有“添加”按钮的控制器中,使其订阅该事件:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTagSelected:) name:@"tagSelected" object:nil];

确保您实现了handleTagSelected:方法,并且在该方法中您可以获取标签对象并关闭已打开的钻取视图:

- (void)handleTagSelected:(NSNotification *)notification {
    Tag *mytag = (Tag *)notification.object;
    [self dismissModalViewControllerAnimated:YES];
}

然后你就可以用标签做任何你想做的事情了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在视图控制器之间传递数据/对象/moc - 最佳实践 的相关文章

随机推荐

  • pandas 如何在时间序列数据上“get_dummies”

    如果我有一些时间序列数据 弥补一些 import numpy as np import pandas as pd np random seed 11 rows cols 50000 2 data np random rand rows co
  • 使用 segue 设置详细视图控制器

    背景 我有一个自定义 UIViewController 类 我在其中使用自定义注释填充 MKMapView 当用户选择注释时 会显示有关该注释的详细信息 并且还会显示一个按钮 供用户选择并调出另一个 UIViewController 其中包
  • 重播非循环 gif 图像

    我有一个非循环 gif 我将其用作两个 JLabel 的 ImageIcon 但不同时使用 我的问题是 当我将第二个 JLabel 的图标设置为 gif 时 动画已经播放过 因此它只显示最后一帧 您知道当 gif 设置为第二个 JLabel
  • VBA 中的哨兵对象

    我在网络上和我自己的项目中普遍看到具有以下模式的代码 Sub Func Application EnableEvents False some code Application EnableEvents True End Sub 自从有生以
  • 我自己的驱动程序是否需要 Windows 7 x64 中的数字签名

    我已经创建了驱动程序来在 Windows 7 x64 上挂接 ssdt 我怀疑是否需要对驱动程序进行数字签名才能在 x64 上以内核模式安装 否则我只需要 Windows 驱动套件即可安装它 除了 Windows Driver Kit WD
  • 获取维度长度,C# 数组

    int arr new int 2 5 var rows arr var cols arr Assert Equals 3 rows Assert Equals 6 cols 您可以使用GetLength some dimension st
  • 用于验证 IPv4 和 IPv6 地址(无主机名)的 JavaScript 正则表达式

    请建议一个可以验证的 JS 正则表达式 IPv4地址 IPv6地址 该正则表达式应该只验证地址而不验证主机名 我有完全相同的需要 所以我改编了正则表达式丹尼尔的精彩回答 这是我能找到的最准确的 不验证主机名 这里是 var expressi
  • Mongodb 带条件聚合查找

    我有一个名为article category其中存储所有article id属于以下类别category id像这样的数据格式 集合 1 article category article id 2015110920343902 all ca
  • Opencv cv::waitKey() 返回值

    我正在 Ubuntu 14 上调试一些使用 OpenCV 的 C 代码 已知该代码可以在 Ubuntu 12 上运行 也可能与其他 OpenCV 库构建一起运行 之前是什么 int key pressed waitKey 0 cout lt
  • getElementsByTagName() 相当于 textNodes

    有什么办法可以得到全部的集合吗textNode文档中的对象 getElementsByTagName 对于 Elements 来说效果很好 但是textNodes 不是元素 Update 我意识到这可以通过遍历 DOM 来完成 正如下面许多
  • 如何使用空手道功能文件中的 .js 文件中的参数调用 Javascript 函数

    可以说我在functions js 文件中创建了javascript 函数 function getReviews reviews var length reviews reviews length return length review
  • 从 Windows 7 中的 php 命令行脚本复制到剪贴板

    我有一个 php 5 5 脚本 我在 Windows 7 中从命令行运行该脚本 如下所示 C php 5 5 5 php exe C scripts putString php 我的问题是 是否可以将脚本中的内容复制到 Windows 剪贴
  • 使用 Guice Custom Scopes 和 Jersey 进行多租户

    我正在使用 Guice for DI 与 Jersey 开发多租户应用程序 我也使用 Dropwizard 但我认为这在这里并不重要 令我困扰的一件事是 某种tenancy id我的申请中到处都是 我的大多数网址如下所示 tenancy i
  • 合并两个具有复杂条件的 pandas 数据框

    我想合并两个数据框 让我们考虑以下两个 df df1 id A ts A course weight id1 2017 04 27 01 35 30 cotton 3 5 id1 2017 04 27 01 36 05 cotton 3 5
  • 如何在 Tomcat 的 web.xml 中映射欢迎文件的过滤器?

    我创建了一个Filter检查Cookies 与请求对象和forward相应的请求感谢this and this问题 现在我想映射这个Filter只是为了welcome file正如我在中声明的那样web xml 说我有welcome fil
  • 使用 Selenium 测试 AngularJS

    我在 ASP MVC AngularJS 堆栈上有一个 SPA 应用程序 我想测试 UI 现在我正在尝试 Selenium 与 PhantomJS 和 WebKit 驱动程序 这是一个示例测试页面 具有单个元素的视图 清单项目 li 从服务
  • http 文件访问和 php 会话

    如果站点有 php 会话来强制对站点上以 php 实现的页面进行身份验证 授权 那么相同的逻辑如何强制访问某些文件 假设目录中的文件存储库 因此 var www html 通过身份验证受到保护 但是 此 PHP 身份验证逻辑不会禁止用户简单
  • 关闭调试打印

    有时我有很多打印分散在函数周围来打印调试输出 为了切换这个调试输出 我想出了这个 def f debug False print builtins print if debug else lambda p None 或者 如果我需要打印除调
  • 为什么自动装箱会使 Java 中的某些调用变得不明确?

    今天我注意到自动装箱有时会导致方法重载解析中的歧义 最简单的例子似乎是这样的 public class Test static void f Object a boolean b static void f Object a Object
  • 在视图控制器之间传递数据/对象/moc - 最佳实践

    我有一个我怀疑很常见的场景 我发现了各种想法来回答其他类似的问题 包括设置 IBOutlet 将 NSmanagementobjects 作为属性传递以及仅使用一个视图控制器但交换视图 但我不确定这将是为我的解决方案实施的最佳想法 我有一个