我正在尝试在 C# 上创建一个基本的 RPN 计算器。目前我正在使用 Monomac 开发它,作为 Mac 应用程序,但我想让它更容易移植和开发多个平台(我正在考虑 Android)。为此,我不是在 Interface Builder 中制作所有按钮,而是以编程方式制作所有内容(输入按钮、输入数字的字段和显示堆栈的区域除外)。
为了实现这一点,我创建了一个名为AgnosticLayout
. 您可以AgnosticLayouts
使用该Button
函数创建执行操作的单个按钮,也可以创建将s 组合在一起的Horizontally
andVertically
函数。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 正在崩溃,而不是程序本身。我不知道消息是什么意思。
我在 Google 中没有找到任何有用的解决方案,主要是因为其中大多数是针对 ObjC 的,我不懂的一种语言。
相关文件:
Calculator:这里有两个重要的类,Calculator
(接收订单并保留堆栈)和AgnosticLayout
.
显示的按钮是 中的按钮Calculator.AgnosticLayout.DefaultLayout()
。
我知道制作唯一名称的方法Joiner
很丑陋:我还不在乎,而且我认为它在 atm 上正常工作,因为如果根本不使用任何约束,整体仍然会失败。
另外,我在 Haskell 玩了很长时间,而且我在 OO 方面没有太多经验,所以如果有更惯用的方式来做我想做的事,我会全神贯注。