如何在 iPhone 上的 ViewController 之间共享对象?

2024-04-16

我的应用程序是一个选项卡栏应用程序,每个选项卡都有一个单独的视图控制器。

我的第一个视图控制器 (A) 中有一个对象,其中包含我存储的所有应用程序数据(请忽略 NSUserDefaults),当我按下第二个视图控制器 (B) 上的按钮时,需要由第二个视图控制器 (B) 访问该数据。我怎样才能以最好的方式实现这一目标?


您的一种选择是将日期模型声明为应用程序委托的实例变量(正如其他评论者所提到的)。

除了按照 nevan 建议引用应用程序委托之外,另一种方法是将属性添加到数据模型的视图控制器类(A 和 B)中。

假设您想在视图控制器之间共享数据模型对象,您可以为每个视图控制器添加一个属性:

@interface AViewController : UIViewController {
    MyDataModel *model;
}

@property (nonatomic, retain) MyDataModel *model;

@end

@interface BViewController : UIViewController {
    MyDataModel *model;
}

@property (nonatomic, retain) MyDataModel *model;

@end

当您初始化视图控制器时,您可以将此属性设置为之前初始化的对象上下文。

您提到了标签栏控制器。如果您的视图控制器通过 IB 连接,您所要做的就是在应用程序委托中设置这些参数applicationDidFinishLaunching:方法,在显示标签栏控制器之前:

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{

    MyDataModel *model;
    AViewController *aViewController;
    BViewController *bViewController;
    ...
}

@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;

@end

@implementation MyAppDelegate

...

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...

    aViewController.model = model;

    bViewController.model = model;

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
}

不要忘记在视图控制器中释放模型dealloc method.


另一种方法是使用单例对象。一个简单的单例示例:

@interface MyDataModel : NSObject
{
}

+ (MyDataModel *) sharedDataModel;

@end

@implementation MyDataModel

static MyDataModel *sharedDataModel = nil;

+ (MyDataModel *) sharedDataModel
{

    @synchronized(self)
    {
        if (sharedDataModel == nil)
        {
            sharedDataModel = [[MyDataModel alloc] init];
        }
    }
    return sharedDataModel;
}

@end

您可以使用类似于以下内容的方式从所有视图控制器访问此数据模型:

MyDataModel *model = [MyDataModel sharedDataModel];

也可以看看this https://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like关于单例的堆栈溢出讨论。

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

如何在 iPhone 上的 ViewController 之间共享对象? 的相关文章

随机推荐

  • API 自动化测试:有没有办法通过内容验证来自动化下载场景?

    我的应用程序中有导出到 Excel 的功能 我有一个场景 执行导出到 Excel 验证 API 响应状态和导出的 Excel 内容 使用 Postman 我可以使用 发送和下载 选项以 xlsx 格式保存导出的 Excel 稍后我可以手动验
  • 如何在 Java 中替换/删除 UTF-8 字符串中的 4(+) 字节字符?

    由于 MySQL 5 1 不支持 4 字节 UTF 8 序列 因此我需要替换 删除这些字符串中的 4 字节序列 我正在寻找一种干净的方法来替换这些字符 Apache 库用问号替换字符对于这种情况来说是可以的 当然 尽管 ASCII 等效的字
  • 与共享数据相比,消息传递的性能损失

    最近有很多关于不使用锁和使用 Erlang 等消息传递方法的讨论 或者关于使用不可变的数据结构 例如函数式编程与 C Java 中的比较 但我关心的是以下几点 AFAIK Erlang 不保证消息传递 消息可能会丢失 如果还要担心消息丢失
  • 压缩从设备获取或从库、iOS 中选择的图像

    在我的应用程序中 用户可以从设备拍摄照片或从库上传照片以将其设置为个人资料照片 现在 当用户完成后 我需要将该图像上传到服务器 通常从设备获取的图像大小为 5 6MB 我需要在上传到服务器之前将其压缩到 25KB 所以我使用以下方法 voi
  • 多标签 OneVsRestClassifier 的网格搜索?

    我正在对多标签数据进行网格搜索 如下所示 imports from sklearn svm import SVC as classifier from sklearn pipeline import Pipeline from sklear
  • Ubuntu 错误“在此 WSL 2 发行版中找不到命令‘docker’。”

    我在 Ubuntu 上运行 WSL 2 在计算机上启动和运行 docker 时遇到一些问题 我安装了 Docker Desktop 并在后台运行 并且还启用了与 Ubuntu 的 WSL 集成 当我尝试运行简单的 docker 命令时 例如
  • 在javascript中将Json时间戳转换为正常日期和时间

    我有一个 Json 时间戳 我想使用 javascript 将其转换为简单的日期时间格式 我需要以下格式的日期和时间 dd mm yyyy hr mn 这是一个示例 json 日期 我希望提取时间戳 timestamp 1326439500
  • 代码编译时方法中函数执行的计数

    我想计算函数 ExecuteAction 在类方法中出现的次数 public class A B public void X ExecuteAction ExecuteAction 得分为 2 因为 ExecuteAction 出现了 2
  • 将文件夹名称添加到输出 Pig Latin

    我在 HDFS 中有下一个目录结构 logs folder 2021 03 01 log1 log2 log3 2021 03 02 log1 log2 2021 03 03 log1 log2 日志由文本数据组成 数据中没有日期 因为它已
  • jQuery Mobile 与 KnockoutJS ListView 问题

    我正在尝试的这个例子 列表视图最终并没有漂亮的外观 谁能建议我做错了什么 这种情况特别发生在 data inset true 上 http jsfiddle net xQ9Uu 1 http jsfiddle net xQ9Uu 1 如果我
  • 立即将已定义的函数应用于所有数据帧[重复]

    这个问题在这里已经有答案了 我已经定义了一个函数 效果很好 尽管如此 我在工作空间中有 20 个数据框 我想要lapply相同的功能 dat1 至 dat20 到目前为止 它看起来像这样 dat1 lt func dat dat1 dat2
  • 为什么 64 位 Delphi 应用程序计算的结果与 32 位构建不同?

    我们最近开始创建应用程序的 64 位版本 在比较测试中 我们发现 64 位版本的计算方式有所不同 我有一个代码示例 演示了两个版本之间的差异 var currPercent currGross currCalcValue Currency
  • 需要从the_content()获取所有;在 WordPress 中?

    我最近刚刚将博客网站上的所有内容导入到 WordPress 中 我需要稍微整理一下 我正在 single php 中工作 我想得到每个 a img src a from the content 我的 php 充其量只是有点粗制滥造 我知道这
  • 如何解决远程 UWP AppService 问题?

    我正在 C 中使用远程 UWP AppServices 并且遇到了一个非常早期的障碍 获取RemoteSystem实例 我按照教程进行操作https msdn microsoft com en us windows uwp launch r
  • RestSharp 到 WCF 作为 JSON 日期格式化/序列化

    我有一个 WCF 方法 它接受 时间戳 列表 public bool SyncTimestamps IList
  • 更改 Drupal 中的节点创建标题?

    假设我有一个名为 产品 的节点 当我创建这样的节点时 它将始终显示 创建产品 作为节点的标题 创建节点时如何更改此标题 你的意思是你有一个内容类型 http drupal org node 21947 产品 创建 产品 类型的节点时的 创建
  • JavaScript 正则表达式中包含的拉丁字符

    我希望将下面的拉丁字符包含在 JavaScript 正则表达式中以进行字符串验证 到目前为止 我只有一个基本的字符串正则表达式 var stringReg a zA Z i 提前致谢 斯卡洛 我在用着 A z u00C0 u00ff s 作
  • 如何为 casper.repeat 设置变量值

    我想根据来自运行 CasperJS 的页面的变量值重复使用 CasperJS 的步骤 为了获得这个值 我做了类似的事情 casper waitForSelector xxxx function myvalue this evaluate f
  • iOS 绑定 javascript 函数来点击

    这在桌面 safari 中有效 但在 iOS 版本中不会弹出警报 是否可以绑定到 iOS 中的 html 元素 每当用户单击页面上的其他位置时 我想关闭下拉菜单 html bind click function alert clicked
  • 如何在 iPhone 上的 ViewController 之间共享对象?

    我的应用程序是一个选项卡栏应用程序 每个选项卡都有一个单独的视图控制器 我的第一个视图控制器 A 中有一个对象 其中包含我存储的所有应用程序数据 请忽略 NSUserDefaults 当我按下第二个视图控制器 B 上的按钮时 需要由第二个视