Как использовать NSToolBar в Xcode 6 и раскадровке?
Я пытался построить приложение Какао, которое использует Swift и Storyboard в Xcode 6, но как я могу использовать NSToolbar
там?
В Xcode 5 и xib вы можете добавить NSToolbar
из библиотеки объектов в любые файлы.xib, а затем нажмите на добавленную панель инструментов, чтобы развернуть ее и перетащить соединение из любых элементов в AppDelegate.h
файл. Таким образом, вы можете создать IBAction
или же IBOutlet
подключение. Я подтвердил, что это также может быть сделано, если вы используете Swift и не раскадровку в Xcode 6. Однако, похоже, что это не так в среде Xcode 6 и Storyboard.
Сначала я создал проект, который использует Storyboard в Xcode 6, но потом я не смог добавить NSToolbar
из библиотеки объектов в контроллер представления в раскадровке. Поэтому я добавил его к объекту Window контроллера окна в раскадровке. Тем не менее, таким образом я не могу создать эти соединения из каких-либо элементов в расширенной панели инструментов ни к AppDelegate.swift
или же ViewController.swift
,
Итак, мой вопрос:
- Возможно ли создать приложение раскадровки, которое использует
NSToolbar
? - Если это возможно, это дополнение
NSToolbar
в оконный контроллер правильный способ использованияNSToolBar
в раскадровке? - Наконец, как я могу создать
@IBOutlet
а также@IBAction
связи есть?
ОБНОВИТЬ
Я обнаружил, что принятый ответ @GeorgeVillasboas работает только для @IBAction
, Я все еще ищу, как создать @IBOutlet
подключение...
6 ответов
У меня была такая же проблема. Решение работает как для Objective-C, так и для проектов Swift.
Работая с раскадровками в OSX, он создает экземпляр NSWindow и переходит к другому NSViewController в качестве своего окна Content Segue, как вы описали.
На вашем ViewController создайте стандартный IBAction, чтобы получать действие при нажатии на панель инструментов. Чтобы подключить его к NSToolbar, просто перетащите его с помощью Control-drag (или leftClick-drag) из NSToolbarItem в объект FirstResponder, как показано на рисунке ниже.
Это откроет ОГРОМНЫЙ список доступных соединений. Ваш IBAction будет в этом списке. Просто выбрал его и все готово.
Надеюсь это поможет!
Вот ответ, который не зависит от подключений во время выполнения - в некоторых приложениях ответ @cdalvaro проходит большую часть пути, но не полный, и для него требуется ViewController, чтобы знать об искусственном NSWindowController
, который не чувствует себя хорошо.
Как и @cdalvaro, первым шагом является создание собственного подкласса NSWindowController
и установить раскадровку WC для этого класса. Затем вы можете создать все свои подключения к и от NSToolbar
(и то и другое @IBOutlet
с & @IBAction
s) в новом WindowController. Все идет нормально.
Последний шаг, который я больше нигде не видел, это как обратиться к ViewController в WindowController - вы не можете создать @IBOutlet
к нему - по тем же причинам, которые мы получили в первую очередь - вы не можете создавать ссылки на разные сцены в раскадровке. Однако WindowController должен иметь ссылку на ViewController, и это делает... self.window!.contentViewController! as! ViewController
Вот полный WindowController с флажком, который устанавливает значения в ViewController, при этом ViewController не нужно ничего знать...
class MyWindowController: NSWindowController {
var viewController: ViewController {
get {
return self.window!.contentViewController! as! ViewController
}
}
@IBOutlet weak var aSwitch: NSButton!
@IBAction func toolbarActionA(sender: AnyObject) {
println("toolbarActionA")
self.viewController.a = !self.viewController.a
self.aSwitch.state = self.viewController.a ? NSOnState : NSOffState
}
}
Это помогло мне в решении IBOutlet, которое вы ищете: /questions/42260536/sozdanie-vyihoda-dlya-nsprogressindicator-vnutri-nstoolbar/42260540#42260540
Обновление (объяснение)
Я обнаружил этот поток, потому что я пытался создать Круговой индикатор хода выполнения на панели инструментов, и я не знал, как его анимировать из ViewController, так как IBOutlet был объявлен внутри пользовательского WindowController.
Наконец, я нашел пост, который я добавил выше, который описывает, как получить доступ к IBOutlet s из других классов.
По сути, я сделал следующее:
- Создайте пользовательский подкласс NSWindowController (CustomWindowController) для контроллера окна, чтобы я мог добавить IBOutlet для ProgressIndicator:
Пример кода:
@interface CustomWindowController : NSWindowController
@property (weak) IBOutlet NSProgressIndicator *progressIndicator;
@end
- Затем в классе ViewController, в методе, который я хочу использовать для обновления состояния индикатора прогресса, я создаю и объект пользовательского контроллера окна.
Пример кода:
CustomWindowController *customWindowController = self.view.window.windowController;`
- Наконец, чтобы изменить состояние индикатора прогресса, нужно только вызвать метод из созданного пользовательского объекта.
Пример кода:
[customWindowController.progressIndicator startAnimation:sender];
или же
[customWindowController.progressIndicator stopAnimation:sender];
Это видео помогло мне создать панель инструментов без единой строки кода: https://www.youtube.com/watch?v=XSQocHG3IjA
Вы можете добавить элемент "Window Controller" из библиотеки объектов (если у вас его нет), подключиться к View Controller (где вы хотите, чтобы отображалась панель инструментов) и следить за видео! Для пользовательских кнопок панели инструментов добавьте элемент "Кнопка изображения" на панель инструментов, просто перетащив из библиотеки объектов. Затем вы можете выбрать изображение для кнопки, установить размер и так далее...
Вот общее решение для торговых точек и акций. он позволяет вам предварительно настроить все те же функции, что и iboutlet для элемента панели инструментов, а также позволяет установить кнопку для функции вместо создания ibaction. надеюсь, это поможет:P
override func viewDidLayout() {
var x = self.view.window?.toolbar?.items[1].label
println(x)
if(self.view.window?.toolbar?.items[0].label! != "Check")
{
toobarediting()
}
println("didlay")
}
func toobarediting() {
self.view.window?.toolbar?.insertItemWithItemIdentifier("Check", atIndex: 0)
}
func toolbarcheck(functiontoset: Selector) {
var y = self.view.window?.toolbar?.items[0] as NSToolbarItem
y.action = functiontoset
if(functiontoset != nil)
{
y.enabled = true
}
}
Вот ссылка на мой вопрос, пытаясь получить более четкий ответ http://www.stackru.com/questions/27371439/use-nstoolbar-outlet-xcode-6-and-storyboard/27374449 но это похоже на ответы, которые я до сих пор это лучший вариант.
Та же проблема IBOutlets относится и к КВО. Одной из особенностей NSSplitViewController является свойство canCollapse для каждого элемента разделенного представления, которое поддерживает KVO, но это невозможно использовать в IB, как и IBOutlets.
Единственный обходной путь, который я вижу, - это добавить NSObjectController к каждой сцене и, когда сцена загружается, установить объект контроллера объекта для объекта в другой сцене (уже загруженной), на которую вы хотите сослаться.