我正在尝试在 C# 上创建一个基本的 RPN 计算器。目前我正在使用 Monomac 开发它,作为一个 Mac 应用程序,但我想让它更容易移植和开发多个平台(我正在考虑 Android)。为此,我不是在 Interface Builder 中制作所有按钮,而是以编程方式制作所有内容(除了输入按钮、输入数字的字段和显示堆栈的区域)。
为此,我制作了一个名为 AgnosticLayout
的类.您可以创建 AgnosticLayouts
与 Button
函数,它创建一个按钮来执行一个 Action ,或者 Horizontally
和 Vertically
功能,哪个组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 这种我不懂的语言。
相关文件:
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/