Как получить доступ к свойствам экземпляра NSWindow, загруженного из файла пера из другого класса? - PullRequest
0 голосов
/ 10 мая 2018

Хотя я программирую на Linux, BSD и Windows в течение многих лет, я новичок в разработке для Mac, и я думаю, что я не 'понимаю' , когда дело доходит до Mac / Objective- Шаблоны разработки C / Xcode.

Я создал новое окно в Интерфейсном Разработчике под названием Window2. Это окно было объектом, добавленным в MainMenu.xib, и не является отдельным XIB-файлом.

На Window2 есть несколько элементов управления, в основном текстовые поля и кнопки. Я подключил эти элементы управления как свойства IBOutlet в файле .h моего оконного контроллера. Я могу успешно получить доступ к этим свойствам внутри самого экземпляра, однако не могу получить к ним доступ из другого класса или даже из метода класса в том же классе.

Я думал об использовании глобального NSMutableDictionary для хранения указателей для каждого из элементов управления, но это кажется «хакерским». Часы интернет-поиска и переполнения стека не дали никаких полезных подсказок.

Есть ли какой-нибудь способ, который соответствует хорошим практикам программирования для доступа к свойствам экземпляра Window2 из метода класса или другого класса?

Я использую Objective-C с Xcode 9.3 на macOS 10.13.4.

Window2Controller.h

@interface Window2Controller

@property (weak) IBOutlet NSTextField * textHostName;

@end 

Ниже приведено описание того, что я хотел бы сделать, и, вероятно, не работает код:

OtherClass.m

#import "Window2Controller.h"

@implementation OtherClass

- (void)printTextHostNameValue
{
    NSString * txtHost = [Window2Controller textHostName] stringValue];
    NSLog(@"txtHost is: %@", txtHost);
}   

1 Ответ

0 голосов
/ 10 мая 2018

Благодаря полезным советам Морица и документации Apple, я нашел решение этой проблемы. Я использовал [[NSApp keyWindow] delegate], чтобы найти делегата моего окна, и я могу получить доступ к свойствам IBOutlet на нем.

Window2Delegate.h

@interface Window2Controller

@property (weak) IBOutlet NSTextField * textHostName;

@end 

После мое новое окно является ключевым:

OtherClass.m

#import "Window2Controller.h"

@implementation OtherClass

- (void)printTextHostNameValue
{
    id del = [[NSApp keyWindow] delegate];
    NSString * hostText = [[del textHostName] stringValue];
    NSLog(@"hostText is: %@", hostText);
}  

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