Câu hỏi Bàn tay ngắn cho [[UIApplication sharedApplication] delegate]?


Tôi đã lưu các biến toàn cục trong AppDelegate của mình và truy cập chúng bằng cách:

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

Cách giới thiệu để tiết kiệm một số cách gõ là gì và vì vậy tôi không cần phải AppDelegate *d = [[UIApplication sharedApplication] delegate]; lặp đi lặp lại? Cảm ơn!


29
2017-11-10 03:44


gốc


nhập AppDelege của bạn vào tệp 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
Lưu ý rằng nếu bạn thấy mình đang nhập 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? - Kristopher Johnson


Các câu trả lời:


Như Shaggy Frog cho biết, xác định macro trong tệp YourAppDelegate.h của bạn, ví dụ như sau:

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

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

[AppDelegate ......];

41
2017-11-10 04:24



Điều này. Đây là giải pháp tốt nhất. - Adam Ernst
Bạn không cần phải quấn nó trong ngoặc đơn như thế này: stackoverflow.com/questions/4549410/…? - ari gold
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". - ari gold


Vì ủy nhiệm ứ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 quyền ứng dụng, rất giống với NSApp bên ngoài cho các ứng dụng Mac OS X Cocoa.

Vì vậy, hãy xác định bên ngoài trong tiêu đề AppDelegate của bạn (hoặc một cái gì đó khác mà bạn sẽ bao gồm ở khắp mọi nơi):

extern AppDelegate* appDelegate;

Sau đó, tạo và đặt nó trong tệp triển khai 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 nó:

#import "AppDelegate.h"

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

11
2017-11-10 03:51



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


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

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


8
2017-11-10 03:52





Tôi tạo ra thể loại gọi là UIApplication + delegate với một số thông điệp tiện lợi 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í 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 một lớp học cần người được ủy quyền, tôi làm điều này:

#import "UIApplication+delegate.h"

...

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

4
2017-11-10 04:01





Tôi cũng tạo ra một thể loại, ngoại trừ việc tôi đã áp dụng nó 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


2
2017-11-10 04:39