"нераспознанный селектор" в Monomac при программном создании элементов пользовательского интерфейса
Я пытаюсь создать базовый калькулятор RPN на C#. В настоящее время я разрабатываю его, используя Monomac, как приложение для Mac, но я хотел упростить перенос и разработку для нескольких платформ (я думаю об Android). Для этого вместо создания всех кнопок в Интерфейсном Разработчике я делаю все (кроме кнопки ввода, поля, в котором набираются цифры, и области, где отображается стопка) программно.
Чтобы добиться этого, я сделал класс под названием AgnosticLayout
, Вы можете создать AgnosticLayouts
либо с Button
функция, которая создает одну кнопку, которая выполняет действие, или Horizontally
а также Vertically
функции, какие группы AgnosticLayout
вместе. Важный метод этого класса Display<T>
, что дает возможность превратить отдельные операции в T
с, и способ группировки T
s вместе, возвращает полный макет типа 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, язык, который я не понимаю.
Соответствующие файлы:
Калькулятор: здесь живут два важных класса, Calculator
(получает заказы и держит стек) и AgnosticLayout
,
Отображаемые кнопки находятся в Calculator.AgnosticLayout.DefaultLayout()
,
Я знаю, что способ сделать уникальные имена на Joiner
уродливо: меня это пока не волнует, и я думаю, что оно работает правильно, потому что, если вообще не использовать никаких ограничений, все равно не получится.
Кроме того, я много времени играю в Haskell, и у меня нет большого опыта работы с OO, поэтому, если есть более идиотский способ делать то, что я хочу, я весь в ушах.
1 ответ
Я не уверен, что вижу что-то (не то, что я знал бы на этом бессмысленном языке;)), но ваша ошибка исходит от копирования NSButton, который не принимает NSCopying...
это может произойти, если вы копируете кнопку или используете ее в качестве ключа в словаре, который неявно сохраняет свои объекты и копирует их ключи.
РЕДАКТИРОВАТЬ
Ваши параметры здесь задом наперед:
NSDictionary.FromObjectsAndKeys(keys,elemarray);
должно быть -> NSDictionary.FromObjectsAndKeys(elemarray,keys);
так что вы на самом деле используете кнопки в качестве клавиш.