好的,我是Objective-C / iPhone编程的新手,所以当我尝试做一些在C ++中很容易的事情时会出现一些问题。
我正在构建一个基于标签栏的iPhone应用程序,其中包含三个视图,每个标签栏按钮一个。在第一个视图中,用户构建一个NSdictionary,第二个视图将显示为图形。要访问这个字典,我将它保存到第一个视图控制器中的.plist,然后在第二个视图控制器中从这个.plist中建立一个新字典。
要制作图表视图,我使用s7graphview,它在SecondViewController中初始化等,但有自己的.h和.m文件,我导入。将值加载到图形(来自创建的字典)中的方法在GraphInfoList.m文件中实现,这意味着我必须从.plist创建另一个字典来访问数据。如何访问已创建的字典?
在执行此操作时,我还创建了一个方法“dataFilePath”,它返回.plist的文件路径,我用它将数据加载到字典中。我找不到实现此方法的其他方法,而不是将其复制/粘贴到使用它的每个.m文件!还有另一种方式吗?
我有一段时间了:iPhone编程中的对象在哪里? .m文件是类,不是吗?我从不使用new运算符创建一个新对象,我想如果我有任何对象要调用我可以访问这些方法(如[FirstViewController dataFilePath])。
我真的不知道如何在Obj-C / Cocoa中处理这个问题,我不知道该搜索什么来找到答案。非常感谢帮助。
答案 0 :(得分:1)
对象是类的实例(.m文件)。您使用new运算符分配/初始化一个新对象,就像在java中一样。您可以导入要使用/有权访问的类的.h,然后使用类似
的内容MyClass *objectInstance = [[MyClass alloc] init];
创建一个实例。
就dataFilePath方法而言......你可以在应用程序的委托(可能是像MyAppNameAppDelegate.m这样的东西)中找到它,这是一个单例(整个应用程序的一个实例)。然后,您可以使用以下方式获取文件路径:
myFilePath = [[[UIApplication sharedApplication] delegate] dataFilePath];
我建议查看一本开头的Objective-c书以获取更多信息。我建议Learn Objective-C on the Mac。另外,我将看一下面向对象编程的基本介绍,因为看起来这就是绊倒你的东西。祝你好运。
答案 1 :(得分:0)
我在不同的视图控制器中使用s7graphview时遇到了同样的问题。我通过在AppDelegate中添加一个NSDictionary作为属性来解决它,当viewwilldisappear方法触发时,我添加了这段代码:
[((MyAppDelegate*) [[UIApplication sharedApplication] delegate]) setDictionary:self.dictionary];
我认为这不是唯一的方法,但你会删除减慢app的.plist代码
答案 2 :(得分:0)
您的应用代表是分享内容的好地方。您可以在应用程序代理中保留数据文件路径功能并访问它
path = [[[UIApplication sharedApplication] delegate] dataFilePath];
别忘了#import“YourAppDelegate.h”文件。
.m文件类似于.cpp文件或.c文件。基本上是实现文件。
答案 3 :(得分:0)
使用NSDictionary
是正确域名对象的不良替代品,在玩杂耍时会遇到问题。通常,对象不是建模数据的最佳方式,例如NSNumber
这样的数字很麻烦。
而是引入适当的域类。让标签栏中的两个via控制器都可以访问同一个对象没有问题,您可以轻松地使用viewWillAppear:
方法将状态从一个视图更新到另一个视图。
甚至有时候你想要一个单身人士。如果任何对象只能有一个逻辑实例,那么单例是可行的方法。不要害怕他们。通常,正如Apple在其框架中使用的懒惰模式是您想要的。例如,这个界面:
@interface MyDomainManager : NSObject { /* ivars here */ }
+(MyDomainManager*)sharedManager;
// More proper tie and method here
@end
然后是这样的实现:
@implementation MyDomainManager
+(MyDomainManager*)sharedManager;
{
static MyDomainManager* manager = nil;
if (manager == nil) {
manager = [[self alloc] init];
}
return manager;
}
// More implementation cruft…
@end
从简单开始,因为这是一个好的开始,然后从那里开始构建。