Приложение Objective C Mac OSX - получить переменную от другого делегата? - PullRequest
1 голос
/ 29 мая 2011

EchoAppDelegate.h

NSString *theString;

EchoAppDelegate.m

/////being declared somewhere here//////
theString = [lastUserInputJabber stringValue];

ChatController.m

//Get theString variable from echoappdelegate
NSString *theStringDiff = theString;

Как мне это сделать?

1 Ответ

5 голосов
/ 29 мая 2011

EchoAppDelegate должен предоставить метод, который возвращает эту строку, или сделать эту строку общедоступным ivar. Например, вы можете реализовать метод получения, например:

// EchoAppDelegate.h
@interface EchoAppDelegate : NSObject <NSApplicationDelegate> {
    NSString *theString;
}
- (NSString *)theString;
@end

и

// EchoAppDelegate.m
@implementation EchoAppDelegate
- (NSString *)theString { return theString; }
@end

или сделайте его объявленным свойством, и Objective-C автоматически предоставит метод получения:

// EchoAppDelegate.h
@interface EchoAppDelegate : NSObject <NSApplicationDelegate> {
    NSString *theString;
}
@property (readonly) NSString *theString;
@end

и

// EchoAppDelegate.m
@implementation EchoAppDelegate
@synthesize theString;
@end

(В зависимости от вашей цели / компилятора вам может не потребоваться объявлять ivar - современная среда выполнения и достаточно недавние компиляторы могут автоматически создавать резервные ivar для объявленных свойств. Также, в зависимости от вашего дизайна, вы можете сделать theString свойство readwrite copy, в этом случае вы также получите метод установки, который копирует произвольную строку в theString.)

Сделав это, ваш делегат приложения теперь предоставляет метод, который возвращает эту строку. Когда вам нужно получить доступ к нему в файле реализации, отличном от файла делегата приложения, используйте -[NSApplication delegate] для получения делегата, а затем используйте метод getter для получения строки:

// ChatController.m
#import "EchoAppDelegate.h"

- (void)someMethod {
    // Get a reference to the application delegate instance
    EchoAppDelegate *appDelegate = (EchoAppDelegate *)[NSApp delegate];

    // Use the application delegate instance to get theString
    NSString *theStringDiff = [appDelegate theString];
}

Как указал Джер, вам следует подумать, является ли делегат приложения правильным местом для хранения этой строки. Делегат приложения должен иметь дело с информацией и поведением, которое применяется ко всему приложению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...