Как использовать 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, как показано на рисунке ниже.

Подключение NSToolbar на XCode 6

Это откроет ОГРОМНЫЙ список доступных соединений. Ваш IBAction будет в этом списке. Просто выбрал его и все готово.

Надеюсь это поможет!

Вот ответ, который не зависит от подключений во время выполнения - в некоторых приложениях ответ @cdalvaro проходит большую часть пути, но не полный, и для него требуется ViewController, чтобы знать об искусственном NSWindowController, который не чувствует себя хорошо.

Как и @cdalvaro, первым шагом является создание собственного подкласса NSWindowControllerи установить раскадровку WC для этого класса. Затем вы можете создать все свои подключения к и от NSToolbar (и то и другое @IBOutletс & @IBActions) в новом 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 к каждой сцене и, когда сцена загружается, установить объект контроллера объекта для объекта в другой сцене (уже загруженной), на которую вы хотите сослаться.

Другие вопросы по тегам