2012-01-26 107 views
1

我試圖圍繞單例包圍我的頭,我明白,應用程序委託本質上是一個單身對象。我想在App Delegate中有一些成員變量,我可以從任何其他類訪問。在我這樣做了.M訪問AppDelegate的成員變量

@interface AppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow   *window; 
    RootViewController *viewController; 
    int screenwidth; 
} 

@property (nonatomic, retain) UIWindow *window; 
@property (nonatomic) int screenwidth; 

然後:我這樣做是在App代表

- (void) applicationDidFinishLaunching:(UIApplication*)application 
{ 
    ... 
    screenwidth=400; //arbitrary test number 

現在我已經在項目中的另一個階級,它這樣做的.H:

#import "AppDelegate.h" 

在.M我有這樣的話:

test=(AppDelegate*)[[[UIApplication sharedApplication] delegate] screenwidth]; 

但是,它聲稱「screenwidth」是未找到的實例方法。我也試過這樣:

test=(AppDelegate*)[[UIApplication sharedApplication] delegate].screenwidth; 

它使用點語法,因爲screenwidth合成,但它聲稱property screenwidth not found

我敢肯定,這些都是可以被簡單地校正的基本問題。任何幫助讚賞。

回答

3

考慮嘗試:

test=[(AppDelegate*)[[UIApplication sharedApplication] delegate] screenwidth]; 

我想你的兩次嘗試都試圖將.screenwidth結果強制轉換爲AppDelegate*

+0

謝謝Tim!欣賞指針。 (沒有雙關語!) – johnbakers

+2

你完全打算雙關語。不要說謊。 – Tim

+0

確實演員陣容不正確,但這不是指定錯誤的原因。 (或者,如果是這樣,編譯器需要一個好頭。) – Caleb

1

確保你要麼提供自己-screenwidth訪問或使用@synthesize指令,讓編譯器提供一個:

@synthesize screenwidth 

@property指令僅僅是訪問器screenwidth物業承諾會提供。您仍然必須按照上面所述提供它們。

+0

是的,我合成;我未能顯示該代碼。 – johnbakers

0

如果你想避免鑄造你的AppDelegate類每一次,我提出以下建議:

MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 

+ (MyAppDelegate *)sharedAppDelegate; 

@property (nonatomic) int screenwidth; 

/* ... */ 

@end 

MyAppDelegate.m

@implementation LcAppDelegate 

+ (MyAppDelegate *)sharedAppDelegate 
{ 
    return (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

/* ... */ 

@end 

當然,你仍需在您要訪問的文件中輸入#import "MyAppDelegate.h"

#import "MyAppDelegate.h" 

/* ... */ 

NSLog(@"the apps screen width: %d", [MyAppDelegate sharedAppDelegate].screenwidth); 

順便說一句,請注意,您不應該在Objective-C代碼中使用int's等。相反,使用NSInteger,NSUInteger,CGFloat等等。