скрыть NSMenu из NSButton внутри пользовательского представления

У меня есть простое приложение строки состояния ядра какао с Xcode 4.6.2. Вот в моем AppController.h у меня есть

@interface AppController : NSObject
@property NSStatusItem *statusItem;
@property IBOutlet NSMenu *statusMenu;

In my AppController.m:

@synthesize statusItem = statusItem;
@synthesize statusMenu = statusMenu;
-(void)awakeFromNib{
    statusItem = [[NSStatusBar systemStatusBar]statusItemWithLength:NSVariableStatusItemLength];
    statusItem.menu = statusMenu;
}

то в моем AppDelegate.m есть функция:

#import "AppController.h"
-(IBAction)someAction:(id)sender{
    //code to do something
    AppController *x = [[AppController alloc]init];
    [x.statusMenu cancelTracking];
}

Я хочу закрыть меню с помощью кнопки, которая выполняет действие внутри пользовательского представления NSMenuItem (из Connection Inspector-> Outlets-> view ctrl + перетаскивание на кнопку). Я не могу выбрать 2 разных отправленных действия для NSButton, поэтому мне нужно закрыть меню, объявленное в классе AppController, из некоторого действия IBAction, которое находится в классе AppDelegate. Как это сделать? Код, который я разместил, не работает. заранее спасибо


person Val K.    schedule 15.06.2013    source источник


Ответы (2)


Ваш код, вероятно, не работает, потому что вы инициализируете второй AppController.

Вам нужна ссылка на исходный AppController в AppDelegate. Этого можно добиться, используя связующие какао. В файле .XIB перетащите новый объект синего цвета из библиотеки объектов, установите его в качестве класса AppController с помощью инспектора, затем перетащите, удерживая нажатой клавишу Control, в заголовок AppDelegate, чтобы создать привязку. Используйте эту ссылку и удалите AppController *x = [[AppController alloc] init];.

person Oskar    schedule 15.06.2013
comment
СПАСИБО! Но есть еще одна вещь, которую нужно сделать, я должен вставить #import AppController.h в AppDelegate.h, иначе IBOutlet скажет имя неизвестного типа. После этого в AppDelegate.m [outletName.statusMenu cancelTracking]; и все идет нормально! Может быть, вы можете отредактировать свой ответ - person Val K.; 15.06.2013
comment
и я также могу удалить #import AppController.h в AppDelegate.m - person Val K.; 15.06.2013

Может быть, попробуйте это:

[[NSStatusBar systemStatusBar] removeStatusItem:[GSAppDelegate alloc].statusMenu];
person goooseman    schedule 15.06.2013