2011-05-13 127 views
1

好吧,我是Objective-C/iPhone编程的新手,所以当我尝试做一些在C++中很容易的事情时会出现一些问题。访问其他类/对象中的方法和变量(其中的对象btw)?

我建立一个基于标签栏的iPhone应用程序有三个视图,每个标签栏按钮一个。在第一个视图中,用户构建一个NSdictionary,第二个视图将显示为一个图形。为了访问这个词典,我将它保存到第一个视图控制器中的.plist中,然后在第二个中从此.plist中构建一个新词典。

为了制作图形视图,我使用了s7graphview,它在SecondViewController中被初始化等,但有它自己的.h和.m文件,我导入了它。在GraphInfoList.m文件中实现了将值加载到图中的方法(来自创建的字典),这意味着我必须从.plist创建另一个字典才能访问数据。我如何访问已经创建的字典?

虽然这样做,我还做了一个方法“dataFilePath”,它返回.plist的文件路径,我用它来将数据加载到字典中。我发现没有其他方法实施这种方法,而不是复制/粘贴到每个使用它的.m文件!还有另一种方式吗?

一段时间我在这里:iPhone编程中的对象在哪里? .m文件是类,是不是?我从来没有使用new运算符创建一个新对象,并且我认为如果我有任何要调用的对象(如[FirstViewController dataFilePath]),我可能会访问这些方法。

我真的不知道在Obj-C/Cocoa中如何处理这个问题,我不知道该如何寻找答案。帮助将非常感激。

回答

0

我有不同的视图控制器中使用s7graphview相同的问题。我解决它通过添加一个NSDictionary作为AppDelegate的一个属性当viewwilldisappear方法大火添加此代码:

[((MyAppDelegate*) [[UIApplication sharedApplication] delegate]) setDictionary:self.dictionary]; 

我想是不是这样做的唯一途径,但你会删除的.plist代码减慢你的应用程序

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。另外,我会看一看面向对象编程的基本介绍,因为看起来这是什么让你绊倒了你。祝你好运。

+0

类和'.m'文件之间通常有1-1映射。但这不是要求。您可以在同一'.m'文件中实现多个类,或者我通常将一个类的实现扩展为多个.m'文件。当你输入'@interface Name:Superclass'时,这个类就是你输入的地方。 – PeyloW 2011-05-13 16:04:52

+0

是的,好点,我只是想尽快提及他如何看待它。 – 2011-05-13 16:19:11

+0

谢谢,试图把功能放在应用程序委托中,并且这样做: 在appDelegate.h中: - (NSString *)dataFilePath; .m: - (NSString *)dataFilePath {NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString * documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:@“data.plist”]; } 当我打电话给 NSString * myFilePath = [[[[UIApplication sharedApplication] delegate] dataFilePath];在FirstViewController.m它说方法-dataFilePath没有找到......有什么问题? – 2011-05-13 16:45:57

0

您的应用程序委托是分享内容的好地方。你可以保持数据文件路径功能在您的应用程序委托和访问它

path = [[[UIApplication sharedApplication] delegate] dataFilePath]; 

不要忘记#IMPORT“YourAppDelegate.h”文件。

.m文件就像.cpp文件或.c文件。基本上,实施文件。

0

使用NSDictionary对于正确的域对象来说是一个糟糕的替代品,您在处理密钥时会遇到问题。通常对象不是模型化数据的最佳方式,例如NSNumber这样的数字只是很麻烦。

而是引入一个合适的域类。通过标签栏中的控制器都可以访问同一个对象,没有任何问题,您可以轻松使用viewWillAppear:方法将状态从一个视图更新到另一个视图。

甚至有时候你想要一个单身人士。如果任何对象只能有一个逻辑实例,那么单例就是要走的路。不要害怕他们。通常,苹果在其框架中使用的懒惰模式就是你想要的。随着例如该接口:

@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 

起步简单,因为这是一个好的开始,然后从那里建立。

相关问题