"нераспознанный селектор" в Monomac при программном создании элементов пользовательского интерфейса

Я пытаюсь создать базовый калькулятор RPN на C#. В настоящее время я разрабатываю его, используя Monomac, как приложение для Mac, но я хотел упростить перенос и разработку для нескольких платформ (я думаю об Android). Для этого вместо создания всех кнопок в Интерфейсном Разработчике я делаю все (кроме кнопки ввода, поля, в котором набираются цифры, и области, где отображается стопка) программно.

Чтобы добиться этого, я сделал класс под названием AgnosticLayout, Вы можете создать AgnosticLayouts либо с Button функция, которая создает одну кнопку, которая выполняет действие, или Horizontally а также Vertically функции, какие группы AgnosticLayoutвместе. Важный метод этого класса Display<T>, что дает возможность превратить отдельные операции в Tс, и способ группировки Ts вместе, возвращает полный макет типа T: так что я могу описать мои кнопки как AgnosticLayoutи каждый платформ способен превратить его в свой собственный графический интерфейс (в случае Mac, в NSView).

Я уже смог реализовать функцию, которая превращает операции в кнопки, и смог показать одну, но я борюсь с объединением кнопок.

Моя текущая функция

NSView Joiner(IEnumerable<NSView> elems, bool isLeftRight)
        {
            NSView view = new NSView();
            int i = 0; // used to give a unique key to each element
            string[] keys = new string[elems.Count()];
            NSView[] elemarray = new NSView[elems.Count()]; // array of elements to be fed to NSDictionary for the constraint
            string visualformat;
            if (isLeftRight) // Creating the visual format string
            {
                visualformat = "|-0-";
            }
            else
            {
                visualformat = "V:|-0-";
            }
            foreach (NSView elem in elems)
            {
                char a = (char) (i+97);
                keys[i] = a.ToString();
                elemarray[i] = elem;
                i += 1;
                view.AddSubview(elem);
                visualformat += "[" + a.ToString() + "]-0-"; 
            }
            visualformat += "|";
            NSDictionary elemsdict = NSDictionary.FromObjectsAndKeys(keys,elemarray);
            view.AddConstraints (NSLayoutConstraint.FromVisualFormat (
                visualformat,
                NSLayoutFormatOptions.None,
                new NSDictionary (),
                elemsdict)
            );

Это не только ужасно, но и не работает. Я получаю это, когда я запускаю все:

2013-11-10 14:00:14.971 CalculatorMac[2006:1007] -[NSButton copyWithZone:]: unrecognized selector sent to instance 0x6555bc0
2013-11-10 14:00:14.972 CalculatorMac[2006:1007] -[NSButton copyWithZone:]: unrecognized selector sent to instance 0x6555bc0

Я полагаю, что это исключение ObjC, а не C#, что означает, что происходит сбой Cocoa, а не самой программы. Я не знаю, что означает это сообщение.

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

Соответствующие файлы:

MainWindowController.

Калькулятор: здесь живут два важных класса, Calculator(получает заказы и держит стек) и AgnosticLayout,

Отображаемые кнопки находятся в Calculator.AgnosticLayout.DefaultLayout(),

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

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

1 ответ

Решение

Я не уверен, что вижу что-то (не то, что я знал бы на этом бессмысленном языке;)), но ваша ошибка исходит от копирования NSButton, который не принимает NSCopying...

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

РЕДАКТИРОВАТЬ

Ваши параметры здесь задом наперед:

NSDictionary.FromObjectsAndKeys(keys,elemarray); должно быть ->
NSDictionary.FromObjectsAndKeys(elemarray,keys);

так что вы на самом деле используете кнопки в качестве клавиш.

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