c# - 以编程方式创建 UI 元素时在 Monomac 上出现 "unrecognized selector"

标签 c# cocoa monomac

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

为此,我制作了一个名为 AgnosticLayout 的类.您可以创建 AgnosticLayoutsButton函数,它创建一个按钮来执行一个 Action ,或者 HorizontallyVertically功能,哪个组AgnosticLayout在一起。这个类的重要方法是Display<T> , 给出了一种将单个操作转换为 T 的方法s,以及一种分组方式T s 在一起,返回类型为 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 正在崩溃,而不是程序本身。我不知道消息是什么意思。

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

相关文件:

MainWindowController .

Calculator :两个重要的类(class)住在这里,Calculator (接收订单并保留堆栈)和 AgnosticLayout .

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

我知道在 Joiner 上创建唯一名称的方法是丑陋的:我还不关心那个,我认为它在 atm 上工作正常,因为如果根本不使用任何约束,整个过程仍然会失败。

此外,我在 Haskell 中玩了很长时间,我对 OO 的经验不多,所以如果有更惯用的方法来做我想做的事情,我就是耳朵。

最佳答案

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

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

编辑

你的参数在这里倒退了:

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

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

关于c# - 以编程方式创建 UI 元素时在 Monomac 上出现 "unrecognized selector",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890878/

相关文章:

iphone - App Delegate 中的 Mac OSX/iPhone 错误处理?

主线程上的计时器时 cocoa 上下文菜单导致崩溃

c# - 使用 NAudio 播放原始 PCM(输出噪音,但在 Audacity 中打开正常)

objective-c - LSSetDefaultRoleHandlerFor 优胜美地中的内容类型

objective-c - 使另一个应用程序的窗口无边框

cocoa - 使 NSTableView 表现得像 WPF StackPanel

cocoa 应用程序插件

c# - 是否可以通过 HwndHost 控件绘制 WPF 控件?

c# - 用 Let 过滤

c# - 如果当前副本正在使用中,则打开文件的卷影副本