2

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

为了实现这一点,我创建了一个名为AgnosticLayout. 您可以AgnosticLayouts使用该Button函数创建执行操作的单个按钮,也可以创建将s 组合在一起的HorizontallyandVertically函数。AgnosticLayout这个类的重要方法是Display<T>,它给出了将单个操作转换为Ts 的方法,以及将Ts 组合在一起的方法,返回一个完整的布局类型T:,以便我可以将我的按钮描述为AgnosticLayout,并且每个平台都能够把它变成它自己的 GUI(在 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:这里有两个重要的类,Calculator(接收订单并保留堆栈)和AgnosticLayout.

显示的按钮是 中的按钮Calculator.AgnosticLayout.DefaultLayout()

我知道制作唯一名称的方法Joiner很丑陋:我还不在乎,而且我认为它在 atm 上正常工作,因为如果根本不使用任何约束,整体仍然会失败。

另外,我在 Haskell 玩了很长时间,而且我在 OO 方面没有太多经验,所以如果有更惯用的方式来做我想做的事,我会全神贯注。

4

1 回答 1

0

我不确定我是否看到任何东西(不是我会用这种乱码语言知道的;))但是您的错误来自复制不采用 NSCopying 的 NSButton ......

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

编辑

你的参数在这里倒退:

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

所以你实际上将按钮用作键。

于 2013-11-11T02:09:14.513 回答