Мое меню, подключенное к моему контроллеру представления IBAction, выделено серым цветом

Я создаю приложение с помощью раскадровки Xcode Interface Builder.

Мой VideoViewController реализует следующее действие:

@IBAction func openVideo(sender: AnyObject) {
    ...
}

При подключении моего пункта меню к Первому ответчику я вижу свое действие:

соединение

К сожалению, когда я запускаю свое приложение, пункт меню становится серым:

введите здесь описание изображения

Есть идеи?


person Martin Delille    schedule 16.07.2016    source источник
comment
Вы также подключили OpenVideo к вашему ViewController (например, New Referencing Outlet › ViewController)?   -  person l'L'l    schedule 16.07.2016
comment
Как я могу это сделать?   -  person Martin Delille    schedule 16.07.2016
comment
Вы должны просто иметь возможность щелкнуть элемент меню «Открыть видео» и перетащить соединитель в свой VideoViewController. Когда вы это сделаете, вы должны увидеть IBAction openVideo для подключения.   -  person l'L'l    schedule 16.07.2016
comment
Кроме того, если у вас нет установки IBOutlet, она вам, вероятно, понадобится: (например, @IBOutlet var openVideoMenuItem: NSMenuItem!). Это мост между IBAction и NSMenuItem.   -  person l'L'l    schedule 16.07.2016


Ответы (3)


Вы должны иметь возможность щелкнуть NSMenuItem и подключить его к вашему VideoViewController. Обычно IBOutlet используется для подключения вашего IBAction:

class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet var myMenuItem: NSMenuItem!

    @IBAction func openItem(sender: AnyObject) {
        print("success!")
    }
}

введите здесь описание изображения

В вашем конкретном случае вы должны щелкнуть и перетащить соединитель в свой VideoViewController.

person l'L'l    schedule 16.07.2016
comment
Как я уже упоминал, я использую раскадровку, а не файл XIB. - person Martin Delille; 18.07.2016
comment
@MartinDelille: это один и тот же процесс, независимо от того, использует ли проект xibs, nibs и/или storyboards. Как упоминалось (дважды), вашему коду нужен IBOutlet, который вы, по-видимому, не включили. Функция IBAction не собирается автоматически подключаться к вашему NSMenuItem — изображение в моем ответе должно проиллюстрировать, как это сделать. Вы смогли попробовать то, что я предложил? - person l'L'l; 18.07.2016
comment
Другой вопрос: какой инструмент вы использовали для создания этой удивительно четкой GIF-анимации? :-) - person Martin Delille; 18.07.2016
comment
@MartinDelille: я использовал screenflow для создания скринкаста без потерь, затем использовал gifbrewery для импорта видео и создания анимированного gif. Это может показаться сложным, но буквально заняло две минуты. - person l'L'l; 18.07.2016
comment
Спасибо за информацию! Что касается моей проблемы, я понимаю, что мне нужно подключить свой NSMenuItem IBOutlet, но я не понимаю, почему, так как у меня нет Objects/Delegate в моей сцене. - person Martin Delille; 18.07.2016
comment
Вы должны подключить NSMenuItem к вашему VideoViewController (а не к объекту/делегату из примера), где, как я полагаю, находятся ваши IBOutlet и IBAction. При перетаскивании подключения к контроллеру из пункта меню и наоборот должны появиться доступные розетки. - person l'L'l; 18.07.2016
comment
При перетаскивании из моего NSMenuItem в мой VideoViewController у меня появляется всплывающее окно Action Segue с Show, Custom и Modal для выбора. При перетаскивании моего VideoViewController в мой NSMenuItem у меня нет доступного соединения. - person Martin Delille; 18.07.2016
comment
Возможно, это поможет увидеть пример проекта? Странно, что NSMenuItem у вас вообще серым цветом (может быть, он не выбран как включенный?). Когда я добавляю новый, он по умолчанию не отображается серым цветом, даже если он ни к чему не подключен. В качестве теста вы можете попробовать создать новый проект, поместить IBAction и IBOutlet в AppDelegate.swift и посмотреть, сможете ли вы подключить NSMenuItem. - person l'L'l; 19.07.2016
comment
Мне удалось заставить его работать на более простом примере. У меня могут быть проблемы с моим NSSplitterController... - person Martin Delille; 19.07.2016

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

Вот что сработало для меня:

  • Создайте @IBAction в цели ViewController
  • Переопределить func validateMenuItem(_ menuItem: NSMenuItem) -> Bool в целевом ViewController (он должен вернуть true, когда подтвердит, что menuItem действительно является menuItem, который вы хотите подключить к своему @IBAction)
  • Подключите MenuItem к First Responder, а затем к @IBAction, который вы создали ранее.

Вот и все. Нажмите бег и выдохните.

person RodrigoFranco    schedule 23.02.2017

Проблема здесь в том, что вам не хватает подчеркивания для параметра. Если вы добавите, что он будет работать с First Responder. Кроме того, для Swift 3 и выше тип отправителя должен быть Any или определенный тип элемента управления, например NSMenuItem, хотя он по-прежнему будет работать с AnyObject.

@IBAction func openVideo(_ sender: Any) {
    ...
}
person Steve Waddicor    schedule 16.04.2018