以编程方式创建UI元素时Mono Mac上的“无法识别的选择器”

时间:2013-11-10 14:30:01

标签: c# cocoa monomac

我正在尝试在C#上创建一个基本的RPN计算器。目前我正在使用Monomac开发它,作为Mac应用程序,但我想让它更容易移植和开发几个平台(我正在考虑Android)。为此,我不是在Interface Builder中创建所有按钮,而是以编程方式创建所有内容(输入按钮,键入数字的字段以及显示堆栈的区域)。

为实现这一目标,我创建了一个名为AgnosticLayout的课程。您可以使用AgnosticLayouts功能创建Button,该功能会创建一个执行操作的按钮,或HorizontallyVertically个功能组AgnosticLayout在一起。这个类的重要方法是Display<T>,它给出了将单个操作转换为T的方法,以及将T组合在一起的方法,返回类型{的完整布局{1}}以便我可以将我的按钮描述为T:,每个平台都可以将其转换为自己的GUI(在Mac的情况下,转换为NSView)。

我已经能够实现将操作转换为按钮的功能,并且能够显示一个,但我正在努力加入按钮。

我目前的职能是

AgnosticLayout

这不仅是他妈的丑陋,而且也行不通。当我运行一切时,我得到了这个:

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)
            );

我认为这是一个ObjC异常而不是C#异常,这意味着Cocoa崩溃了,而不是程序本身。我不知道这个消息是什么意思。

我在谷歌找不到任何有用的解决方案,主要是因为大多数都是针对ObjC的,这是一种我不懂的语言。

相关文件:

MainWindowController

Calculator:这里有两个重要的类,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 (接收订单并保留堆栈)和Calculator

显示的按钮是AgnosticLayout

中的按钮

我知道在Calculator.AgnosticLayout.DefaultLayout()上制作唯一名称的方式很丑陋:我还不关心它,我认为它正常工作,因为如果不使用任何约束仍然失败。

另外,我来自Haskell很长一段时间,而且我对OO没有很多经验,所以如果有更多惯用的方法来做我想做的事情,我都是耳朵。

1 个答案:

答案 0 :(得分:0)

我不确定我看到了什么(不是我会用这种胡言乱语来知道的;)) 但是你的错误来自复制NSButton,它不采用NSCopying ......

如果您复制按钮或将其用作字典中的键,隐式保留其对象并复制其键,则可能会发生这种情况。

修改

你的参数在这里向后:

NSDictionary.FromObjectsAndKeys(keys,elemarray);应该是 - &gt;
NSDictionary.FromObjectsAndKeys(elemarray,keys);

所以你实际上是使用按钮作为键。