Использовать NSToolBar Outlet xcode 6 и раскадровку?

Я пытаюсь добавить выход в свой контроллер просмотра для элемента панели инструментов в моем оконном контроллере. Я пробовал играть с первым ответчиком и привязками, но не смог найти никаких решений.

Аналогичный вопрос, на который был дан ответ, дал некоторое представление, но никто ничего не упомянул об IBOutlets, кроме как спрашивать, как их добавить в комментариях. Ответ был принят, поэтому я предполагаю, что никто не добавит к нему.

Как использовать NSToolBar в Xcode 6 и раскадровке?

Если мой вопрос вообще не ясен, я хотел бы иметь возможность добавить это в свою программу раскадровки.

@IBOutlet weak var Mytoolbar: NSToolbarItem!

func enabletoolbar()
{
    Mytoolbar.action = "FunctionIn.ViewController.swift"
    Mytoolbar.enabled = true
}

person nsij22    schedule 09.12.2014    source источник


Ответы (4)


Я нашел достойный обходной путь, добавив IBOutlets в свой пользовательский класс NSWindow и используя раскадровку для подключения моих представлений к IBOutlets. Затем я получил доступ к этим представлениям из своего класса NSViewController, получив их из пользовательского NSWindow.

person VinceFior    schedule 13.07.2015
comment
Это было очень полезно для меня, с небольшим изменением. Вместо подкласса NSWindow я создал подкласс NSWindowController, согласовал его с NSTextFieldDelegate и реализовал controlTextDidEndEditing() и controlTextDidChange(). В этих методах я использую свойство contentViewController NSWindowController для вызова моего пользовательского метода поиска в классе NSViewController, передавая строку поиска в качестве аргумента. - person nstein; 21.07.2015

В основном вам нужно установить действие и другие свойства для элемента панели инструментов, но не на панели инструментов. Так что попробуй так же.

person Hussain Shabbir    schedule 09.12.2014

я закончил тем, что сделал это в своем контроллере представления, который, кажется, работает

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
    }
}

Кажется, это позволяет мне сделать кнопку панели инструментов доступной/недоступной, когда мне нужно, чтобы она изменилась, она кажется намного более громоздкой и подверженной ошибкам, чем

myitem.enable = fale 
myitem.action = nil

это действительно лучший способ для приложения на основе раскадровки в osx?

person nsij22    schedule 09.12.2014

В то время как подключение IBActions работает с использованием либо первого ответчика, либо путем добавления объекта на сцену, а затем изменения его класса на класс контроллера представления окна, это не помогает с IBOutlets и делегатами, которые вы хотели бы указать на контроллер представления .

Вот обходной путь для этого:

Добавьте панель инструментов в контроллер представления, а не в его окно. Таким образом, вы можете легко установить все соединения IBOutlet в сцене контроллера представления. Я делал это годами и не обнаружил проблем с этим, даже при использовании вкладок.

Тогда вам придется назначить панель инструментов окна в коде. Например. нравится:

@interface ViewController ()
    @property (weak) IBOutlet NSToolbar *toolbar; // connect this in your storyboard to the Toolbar that you moved to the View Controller Scene
@end

- (void)viewWillAppear {
    [super viewWillAppear];
    self.view.window.toolbar = self.toolbar;
}
person Thomas Tempelmann    schedule 06.07.2021