Подтвердить что ты не робот

Распаковка приложений Mac - доступ к документу в NSViewController

В настоящее время я борюсь с NSDocument в основанной на документах статье Cocoa Application (Objective C). Может ли кто-нибудь сказать мне, как я могу получить доступ к документу в подклассе NSViewController?

Я попытался получить к нему доступ следующим образом: но документ имеет значение null:

[self.view.window.windowController document];

Спасибо за вашу помощь!

С уважением Мартин

4b9b3361

Ответ 1

Я просто боролся с этим сам. Я начал со стандартного шаблона Yosemite и пытался использовать [self.view.window.windowController document] в -viewDidLoad. В этот момент self.view.window есть nil, поэтому нет способа добраться до document.

Трюк состоит в том, чтобы подождать до -viewWillAppear. К тому времени, когда он вызывается, заполняется self.view.window и доступен document.

Последовательность: -makeWindowControllers вызывает -self addWindowController: результат раскадровки - instantiateControllerWithIdentifier:. -addWindowController: вызывает вызов VC -viewDidLoad перед возвратом. Затем, наконец, вызывается -viewWillAppear (и доступен document).

Ответ 2

Я знаю, что исходный вопрос был для Objective-C, но для других, использующих Swift, могут помочь протоколы. Базовая концепция может быть применена и в Objective-C.

Вместо того, чтобы вернуться к оконному контроллеру, вы можете использовать инъекцию зависимостей:

1) Создайте свойство document на вашем оконном контроллере и любых контроллерах представлений, которым необходимо получить доступ к документу (или используйте уже существующее свойство representedObject). Чтобы сделать это проще, вы можете использовать протокол для определения свойства документа или для приведения свойства representedObject к типу вашего документа, если вы идете по этому маршруту. Сделать все контроллеры представлений, которым необходимо получить доступ к документу, принять этот протокол.

protocol DocumentAccessing {
   var document: MyDocument? { get set } // could also use an implicitly unwrapped optional if the document is required to be set for the app to function
}

2) В методе makeWindowControllers() вашего подкласса документа после создания вашего оконного контроллера установите его свойство документа в self (поскольку это документ).

- (void)makeWindowControllers {
     MyWindowController *windowController = MyWindowController()
     windowController.document = self;
     [self addWindowController:windowController];
}

3) Внутри вашего подкласса оконного контроллера после создания экземпляров ваших контроллеров представлений задайте свойство документа контроллера вида для свойства документа оконного контроллера.

4) Теперь, когда ваш контроллер просмотра загружен, его свойство документа должно быть заполнено.

Ответ 3

Это не касается непосредственно вопроса. Но приведенная ниже ссылка Q & A показывает, как получить доступ к модели данных в вашем документе из объектов NSControl с помощью привязок, используя подготовленный объект NSViewController.

https://developer.apple.com/library/content/qa/qa1871/_index.html

Я установил представленный объект для NSViewController в Document.m следующим образом:

- (void)makeWindowControllers {
NSWindowController* wc = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:@"Document Window Controller"];
NSViewController* vc = wc.contentViewController;
vc.representedObject = self.model;

[self addWindowController:wc];

}

Теперь отображается объект моего ViewController для модели. Если моя модель имеет свойство text, я могу связать любой NSControl с этим свойством через ViewController с помощью keyPath: self.representedObject.text