2010-11-10 19 views
29

tôi lưu trữ các biến toàn cục trong appdelegate tôi và truy cập chúng bằng cách:Bàn tay ngắn dành cho [[UIApplication sharedApplication] delegate]?

AppDelegate *d = [[UIApplication sharedApplication] delegate]; 
d.someString = ... 

Có gì các đề nghị cách để tiết kiệm một số cách gõ và vì vậy tôi không cần phải AppDelegate *d = [[UIApplication sharedApplication] delegate]; một lần nữa và một lần nữa? Cảm ơn!

+0

nhập AppDelege của bạn vào tập tin pch của bạn. Bằng cách này, bạn không cần phải nhập vào tất cả các tệp và bạn có thể nhận macro này ở bất kỳ đâu trong dự án của mình. – Ans

+0

Lưu ý rằng nếu bạn thấy mình gõ 'AppDelegate * d = [[UIApplication sharedApplication] delegate];' một lần nữa và một lần nữa, đó có thể là một mùi mã. Bạn có thực sự cần ứng dụng đại biểu cho các ứng dụng-delegate-ish điều, hoặc bạn đang sử dụng nó như là một bãi rác cho nhà nước toàn cầu? –

Trả lời

41

Như Shaggy Frog nói, định nghĩa một macro trong file YourAppDelegate.h của bạn, ví dụ như thế này:

#define AppDelegate (YourAppDelegate *)[[UIApplication sharedApplication] delegate] 

Sau đó, bạn có thể nhận được các đại biểu ứng dụng trong mã của bạn như thế này:

[AppDelegate ......]; 
+2

Điều này. Đây là giải pháp tốt nhất. –

+1

Bạn không cần phải quấn nó trong dấu ngoặc đơn như thế này: http://stackoverflow.com/questions/4549410/define-the-app-delegate-as-a-constant]? –

+0

Ngoài ra, hãy đảm bảo rằng "AppDelegate" và "YourAppDelegate" là các từ khác nhau. Đôi khi "YourAppDelegate", đó là tên của ứng dụng được ủy quyền mặc định là "AppDelegate". –

11

Vì đại biểu ứng dụng của bạn không bao giờ thực sự thay đổi, bạn có thể tạo bên ngoài mà bạn xác định trong mã ủy nhiệm ứng dụng, rất giống với ứng dụng bên ngoài dành cho Mac OS X Cocoa.

Vì vậy, xác định bên ngoài trong tiêu đề appdelegate của bạn (hay cái gì khác mà bạn cần phải có ở khắp mọi nơi):

extern AppDelegate* appDelegate; 

Sau đó tạo ra nó và đặt nó trong tập tin thực thi của bạn:

AppDelegate* appDelegate = nil; 

// later -- i can't recall the actual method name, but you get the idea 
- (BOOL)applicationDidFinishLaunchingWithOptions:(NSDictionary*)options 
{ 
    appDelegate = self; 
    // do other stuff 
    return YES; 
} 

Sau đó, các lớp khác chỉ có thể truy cập vào:

#import "AppDelegate.h" 

// later 
- (void)doSomethingGreat 
{ 
    NSDictionary* mySettings = [appDelegate settings]; 
    if([[mySettings objectForKey:@"stupidOptionSet"] boolValue]) { 
    // do something stupid 
    } 
} 
+3

Tôi thích giải pháp này khi các trình truy cập ký hiệu dấu chấm làm việc với giải pháp này – Rob

8

Bạn chỉ có thể tạo kiểu chữ C acro và đặt nó vào một tập tin tiêu đề ở đâu đó.

(Khi sử dụng đại biểu ứng dụng của bạn như là một biến nhận tất cả toàn cầu khổng lồ, đó là một rant cho một ngày khác.)

4

tôi tạo ra một category gọi UIApplication + ủy với một số thông thuận tiện trong đó. Nhận được đại biểu cụ thể của tôi là một trong những thông điệp tiện lợi. Vì vậy, ví dụ, nếu đại biểu ứng dụng của tôi được gọi MyAppDelegate, nó sẽ trông như thế này:

UIApplication + delegate.h

#import "MyAppDelegate.h" 

@interface UIApplication(delegate) 
+ (MyAppDelegate *)thisApp; 
@end 

UIApplication + delegate.m

#import "UIApplication+delegate.h" 


@implementation UIApplication(delegate) 

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

@end 

Trong lớp học cần người được ủy quyền, tôi thực hiện việc này:

#import "UIApplication+delegate.h" 

... 

- (void)doStuff { 
    MyAppDelegate *app = [UIApplication thisApp]; 
    // use "app" 
} 
2

Tôi cũng đã tạo một danh mục, ngoại trừ việc tôi đã áp dụng danh mục của mình cho NSObject để bất kỳ đối tượng nào trong ứng dụng đều có thể dễ dàng đến được đại biểu.


#import "MyAppDelegate.h" 

@interface NSObject(delegate) 
- (MyAppDelegate *) appDelegate; 
@end 

#import "NSObject+delegate.h" 

@implementation UIApplication(delegate) 

- (MyAppDelegate *)appDelegate { 
    return (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

@end 

Các vấn đề liên quan