8

在我的iPhone應用程序中,有一個設置助手幫助用戶輸入大量數據。它基本上是一個有很多UIViewController的UINavigationController。現在,在某個時刻,我想訪問用戶在他看到的第一個UIViewController中輸入的變量。我可以在每個UIViewController與setter方法之間傳遞變量,但我想有一種更簡單的方法。在許多UIVIwwlers之間傳遞一個變量

回答

7

如果需要,可以用C風格聲明全局變量或類變量。如果你想在同一變量在幾個UIViewController中的你的子類可供選擇,你會宣佈它作爲你的第一個控制器的.h文件中的外部變量,例如:

#import <UIKit/UIKit.h> 

extern NSString *myGlobalString; 

@interface MyFirstViewController : UIViewController { 
... 

你然後在沒有extern的.m文件中重新聲明它。

#import "MyFirstViewController.h" 

NSString *myGlobalString; 

@implementation MyFirstViewController 

你不應該重新聲明它在其他的.m或.h文件,但你可以在導入MyFirstViewController.h所有文件訪問變量。設置變量時,請注意釋放並妥善保存。用這種全局變量創建內存泄漏很容易。

+0

我不需要存儲指向原始MyFirstViewController的指針來訪問它嗎? – fabian789 2010-10-21 06:29:19

+0

不,你不必存儲任何指向對象的指針來訪問這種類型的變量,但是你只能得到它的一個實例,並且它在所有對象之間共享。 – user362178 2010-10-21 06:32:10

+0

好的,謝謝!我一回家就會試試這個。 – fabian789 2010-10-21 06:49:04

3

雅,有很多來處理這一個簡單的方法.....

你可以把全局變量

在你Delegate.h文件中聲明你的變量:

@interface Smoke_ApplicationAppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 
    UINavigationController *navigationController; 
    NSString *messageString; //This would be your String Variable 

} 

@property(nonatomic,retain)NSString *messageString; 

其次在Delegate.m文件

@implementation Smoke_ApplicationAppDelegate 

@synthesize window; 
@synthesize navigationController; 
@synthesize messageString; // Synthesize it over here.. 

做到這一點。現在,你可以在所有使用這個字符串變量/任何你想要的類..

要使用這個全局變量。

只需導入您委派文件 使得它的OBJ ....

#import "DelegateFile.h" 

@implementation About 

DelegateFile *appDel; 
在你class.m

現在

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    appDel=[[UIApplication sharedApplication]delegate]; 

} 

現在,你可以通過這個任何地方訪問它在你的類對象:

appDel.messageString

只要按照我的步驟仔細 給這麼多的痛苦,我的手指, 之後,我相信這肯定會幫助你.....

有一個安逸的生活,

+0

謝謝,聽起來不錯。 – fabian789 2010-10-21 13:46:55

3

一個簡單而重複使用而用可擴展的方式來解決這個問題就是使用單例。例如,聲明一個名爲SetupConfig的新類。

你SetupConfig.h那麼應該如下所示:

@interface SetupConfig : NSObject { 
    NSString *_myString; 
} 

@property (retain) NSString *myString; 

+ (id)sharedSetupConfig; 

@end 

以及相應的SetupConfig.m:

#import "SetupConfig.h" 

SetupConfig *g_sharedSetupConfig = nil; 

@implementation SetupConfig 

@synthesize myString = _myString; 

+ (id)sharedSetupConfig { 
    if (!g_sharedSetupConfig) { 
     g_sharedSetupConfig = [[SetupConfig alloc] init]; 
    } 
} 

@end 

現在,你想從訪問myString的視圖控制器實現:

@import "MyViewController.h" 
@import "SetupConfig.h" 

@implementation MyViewController 

- (void)methodDoingSomethingWithSingletonString 
{ 
    NSString *myString = [[SetupConfig sharedSetupConfig] myString]; 
} 

@end 

單身方法比usi有許多優點一個全局C變量。首先,您不必一遍又一遍地重新聲明全局變量。更重要的是,你的「全局」變量被封裝在一個類中。綜合屬性獲取器/設置器是將實際變量從代碼的其餘部分抽象出來的一種好方法。最後,這個實現可以很容易地集成到單元測試中。

0

我不會太快回避Objective-C這樣一個很好的功能的數據封裝。

如果你正在收集的東西,你會認爲是「設置」考慮使用NSUserDefaults。

如果你的觀點以結構化的方式進行到下一個方式,考慮製作一個「數據」類,不管你在做什麼,然後將它從父視圖傳遞到子視圖直到你到達那裏。 (請記住,「通過」不是一個昂貴的操作,東西保持,你通過一個小指針)

如果你真的想單身路線,考慮使它成爲應用程序委託的屬性(一個已經存在單身人士)

請記住,只有「傳入」數據的路線帶來了額外的優勢,以後可能需要多次收集該起始信息,並啓動不同的可能的最後一個視圖,而且這只是微不足道的通過一個不同的。如果你走遍全球的路線,那麼你就必須開始重新寫你以前訪問過的任何地方。

0

你可以使用它作爲單例,或者你可以保留它在應用程序委託和調用像 [appdelegate getstring];