Я разрабатываю приложение, которое является одним NSWindow
, и нажатие кнопки внутри окна будет содержать NSViewController
, и в этом контроллере будет существовать кнопка, которая будет представлять разные NSViewController
. Я знаю, как менять вид в окне, но я столкнулся с проблемой, пытаясь сделать это с помощью нескольких контроллеров. Я разрешил проблему, но я не верю, что делаю это поведение соответствующим образом.Правильный способ представления другого NSViewController в NSWindow
я первоначально определен метод в AppDelegate
:
- (void)displayViewcontroller:(NSViewController *)viewController {
BOOL ended = [self.window makeFirstResponder:self.window];
if (!ended) {
NSBeep();
return;
}
[self.box setContentView:viewController.view];
}
мне определить цель/действие для NSButton
к AppDelegate, и вот где я называю этот метод, чтобы показать новый контроллер представления:
- (IBAction)didTapContinue:(NSButton *)sender {
NewViewController *newVC = [[NewViewController alloc] init];
[self displayViewcontroller:newVC];
}
Это делает работу - она представляет собой вид контроллера нового вида. Однако, если я затем нажимаю любую кнопку в этом представлении, у которой есть целевая/действительная настройка, которая находится внутри класса контроллера класса, приложение моментально падает.
Чтобы решить эту проблему, я должен изменить didTapContinue:
на следующее:
- (IBAction)didTapContinue:(NSButton *)sender {
NewViewController *newVC = [[NewViewController alloc] init];
[self.viewControllers addObject:newVC];
[self displayViewcontroller:[self.viewControllers lastObject]];
}
Прежде всего, вы можете объяснить, почему это решает проблему? Кажется, это связано с тем, как контроллер «удерживается» в памяти, но я не уверен.
Мой вопрос: как мне настроить это, чтобы я мог менять вид из любого контроллера вида? Я планировал получить ссылку на AppDelegate и вызывать displayViewcontroller:
с новым контроллером, который я только что создал в этом классе, но это приводит к сбою. Мне нужно сначала сохранить его в массиве, а затем отправить эту ссылку в этот метод. Это действительный подход - сделать массив viewControllers
открытым, а затем вызвать этот метод с помощью lastObject
или как его настроить?
Быстрый вопрос. Вы работаете в Mavericks или Yosimite? – MacUserT
@MacUserT Yosemite :) – Joey