Как я могу сделать объект делегатом окна? - PullRequest
4 голосов
/ 09 октября 2011

Я пытаюсь выяснить MonoMac с Xcode 4, и большинство вещей, кажется, работает.Однако я не могу понять, как заставить windowWillClose: работать.

Я добавил

[Export ("windowWillClose:")]
    void windowWillClose(NSNotification notification)
    {
        Environment.Exit(0);    
    }

в MainWindow.cs и сделал MainWindow делегатом для окна.(Я пытался сделать MainWindowController делегатом, но это просто не сработало.)

Однако, когда я закрываю окно, метод делегата не вызывается.

Что я пропускаю?

Ответы [ 2 ]

1 голос
/ 30 августа 2013

С изображениями: http://www.netneurotic.net/Mono/MonoMac-windowWillClose.html

Хитрость заключается в том, чтобы создать метод, который вызывает Environment.Exit () для выхода из приложения, как и любого другого приложения .NET.

Другой трюкСледует отметить, что Environment.Exit () не работает, когда объекты Какао живы.Но NSApplication.SharedApplication.Terminate (это) работает.Я не знаю, как вернуть код ошибки таким образом.

Какао, и, следовательно, MonoMac, использует «делегаты», чтобы позволить одному объекту реагировать, когда что-то происходит с другим объектом.Мы будем использовать эту концепцию для вызова Terminate () при закрытии главного окна.

У объекта Какао есть «выходы», которые выглядят как указатели на другие объекты.Я не знаю, если это технически правильное описание.Это не важноОдним из выходов является «делегат», который мы будем устанавливать для объекта, который содержит метод, который мы хотим вызвать при закрытии окна.Следовательно, мы должны установить выход делегата главного окна для нашего объекта.

Мы будем использовать класс MainWindow, определенный в MainWindow.cs, в качестве делегата для главного окна.Я предполагаю, что это означает, что мы используем объект в качестве собственного делегата или что-то в этом роде.Это все еще будет работать.

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

  1. Дважды щелкните MainWindow.xib, чтобыоткройте Xcode.

  2. В Xcode найдите главное окно.Это большая вещь, которая выглядит как окно.

Рисунок 1: Большая вещь под названием «Окно» - это главное окно.

  1. Щелкните правой кнопкой мыши настрока заголовка окна для отображения выходов окна.

Вы увидите один выход, называемый «делегат».

Рисунок 2: Один из «Розеток» - «делегат».

  1. Найдите «Библиотеку объектов» и синее поле в ней.Синяя рамка - это объект.

Рисунок 3: Синяя рамка - это объект.

  1. Перетащите синюю коробку на серую вещь с иконками слева отокно.

Изображение 4: синий значок находится под значком окна.

  1. Сделайте синий блок объектом "MainWindow".Нажмите на синее поле и измените его класс на «MainWindow».

Рисунок 5. Обновите имя класса для синего поля.

  1. Нажмите клавишу управления и перетащитеиз строки заголовка окна в синее поле.Затем выберите опцию «делегировать» в появившемся меню.

Рисунок 6: Меню, которое появляется при перетаскивании с помощью элемента управления.

Наш объект MainWindow теперь является делегатом дляглавное окноЭто означает, что он может реагировать на то, что происходит с окном.

  1. Добавьте следующий код в MainWindow.cs:

    [Export ("windowWillClose:")] publicvoid WindowWillClose (уведомление NSNotification) {Console.WriteLine ("windowWillClose:");NSApplication.SharedApplication.Terminate (this);
    }

Оператор [Export ("windowWillClose:")] сообщает компилятору (предположительно, компилятору, но, возможно, какой-то другой утилите техническиговорит, что следующее объявление метода является эквивалентом C # объявленного метода Objective-C.Метод может иметь другое фактическое имя, но должен называться достаточно похожим образом, чтобы мы могли его легко идентифицировать.Я обычно просто изменяю первую букву на ее заглавную версию, чтобы она соответствовала стилю C #.

  1. Скомпилируйте приложение, исправьте все сделанные вами опечатки, затем запустите его.Попробуйте закрыть окно.Приложение будет закрыто.

Если нет, повторяйте все шаги, описанные здесь, до тех пор, пока это не произойдет.

0 голосов
/ 12 октября 2011

Вы упомянули, что вы сделали MainWindowController в качестве делегата, я бы посоветовал создать отдельный / внутренний класс, наследующий от NSWindowDelegate, переопределить метод WillClose (NSNotification notification) и установить его в качестве делегата окна.Работа выполнена.

Код:

    class MyDelegate:NSWindowDelegate
    {
        public override void WillClose (NSNotification notification)
        {

        }
    }

В методе AwakeFromNib добавьте:

Window.Delegate = new MyDelegate();
...