2011-05-13 129 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 

起步簡單,因爲這是一個好的開始,然後從那裏建立。

相關問題