2009年6月1日星期一

[iPhone程式]iPhone開發心得06-全域變數(Global Variable)的使用

Share/Bookmark


☉目標:在第一個頁面,點選下一頁的按鈕後設定全域變數的數值,接著切換到第二個頁面,在第二個頁面點選按鈕後可以取得全域變數的數值

☉使用時機:在作頁面切換的時候,可能會需要傳遞一些參數,這些參數的量不大,存到資料庫太麻煩,沒有必要存到資料庫再取出,因此可以用這樣的方式處理。

☉步驟說明:
(1)在TransferViewAppDelegate.h宣告一個變數,這裡我取名為globalData。記得要設置@property和@synthesize。

@interface TransferViewAppDelegate : NSObject <uiapplicationdelegate> {

    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;	    
    NSPersistentStoreCoordinator *persistentStoreCoordinator;

    UIWindow *window;
	
	UINavigationController *vc1;
	
	
	//global variable
	NSMutableArray *globalData;
}

- (IBAction)saveAction:sender;

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@property (nonatomic, readonly) NSString *applicationDocumentsDirectory;

@property (nonatomic, retain) IBOutlet UIWindow *window;

@property (nonatomic, retain) IBOutlet UINavigationController *vc1;
@property (nonatomic, retain) IBOutlet NSMutableArray *globalData;

@end

(2)切換頁面的相關程式碼可以參考簡單的View切換教學,但是這篇文章對於Interface Builder的使用僅以圖片帶過,沒有做太多的著墨,初學者可能會有點混淆,建議參考這篇建立View和Controller的對應關係,相信能夠比較快的進入狀況。 接下來,假設你的程式已經可以正確的進行頁面切換(從第一頁切換到第二頁)

(3)在第一頁的header file:page1.h宣告AppDelegate變數。記得要設置@property和@synthesize。
#import <uikit uikit.h>
#import "page2.h"

@interface page1 : UIViewController {
	page2 *pg2;
	
	TransferViewAppDelegate *appDelegate;
}


-(IBAction)nextPage:(id)sender;

@property (nonatomic,retain) IBOutlet page2 *pg2;

@property (nonatomic,retain) IBOutlet TransferViewAppDelegate *appDelegate;

@end

(4)在page1.m中設定全域變數的數值為「12345678」。我是加在viewDidLoad事件中,這表示在view被載入後這個事件處理常式就會被執行。或者,你也可以加在頁面切換的button事件中(Touch Up Inside)。
- (void)viewDidLoad {
    [super viewDidLoad];
	
	appDelegate = (TransferViewAppDelegate *)[[UIApplication sharedApplication] delegate];
	appDelegate.globalData = [[NSMutableArray alloc] init];
	[appDelegate.globalData addObject:@"12345678"];
}
上面程式碼先取得整個應用程式的appDelegate,一個iPhone應用程式只有一個appDelegate。接著,初始化appDelegate中的變數,也就是我們在步驟(1)宣告的變數。最後,設定變數的數值為12345678。

這是本篇教學的重點。透過這樣的方式取得appDelegate,我們就可以在任何頁面存取appDelegate中的變數
appDelegate = (TransferViewAppDelegate *)[[UIApplication sharedApplication] delegate];

(5)在page2.h中重複步驟(3)的動作,只是現在是要在第二頁的header file:page2.h,宣告AppDelegate變數,並記得要設置@property和@synthesize。

(6)最後,在取得全域變數資料的按鈕中加入下列程式碼。
@synthesize appDelegate;

-(IBAction)getGlobalVariable:(id)sender{
	
	appDelegate = (TransferViewAppDelegate *)[[UIApplication sharedApplication] delegate];
	NSString *data =	[appDelegate.globalData objectAtIndex:0];
}
在這段程式碼中,先取出了appDelegate。接著,從appDelegate裡面取出全域變數的數值。設置中斷點(breakpoint)你可以看到資料被正確的傳遞!

☉程式範例:下載



1 意見 |

張貼意見

xuan 2010年3月18日下午10:15 提到...

不好意思,我是一個iphone新手,想請教您一下,關於全域變數這個程式,我執行以後我點選"取得上一頁的資料"並無任何反應,在Xcode裡面有個警告在第19行 warring:uused variable'data' 想請教您這部分是什麼問題,謝謝!

 
Creative Commons License
本 著作 係採用 創用 CC 姓名標示-非商業性-相同方式分享 2.5 台灣 授權條款授權.