我正在尝试在C#上创建一个基本的RPN计算器。目前我正在使用Monomac开发它,作为Mac应用程序,但我想让它更容易移植和开发几个平台(我正在考虑Android)。为此,我不是在Interface Builder中创建所有按钮,而是以编程方式创建所有内容(输入按钮,键入数字的字段以及显示堆栈的区域)。
为实现这一目标,我创建了一个名为AgnosticLayout
的课程。您可以使用AgnosticLayouts
功能创建Button
,该功能会创建一个执行操作的按钮,或Horizontally
和Vertically
个功能组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的,这是一种我不懂的语言。
相关文件:
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没有很多经验,所以如果有更多惯用的方法来做我想做的事情,我都是耳朵。
答案 0 :(得分:0)
我不确定我看到了什么(不是我会用这种胡言乱语来知道的;)) 但是你的错误来自复制NSButton,它不采用NSCopying ......
如果您复制按钮或将其用作字典中的键,隐式保留其对象并复制其键,则可能会发生这种情况。
修改强>
你的参数在这里向后:
NSDictionary.FromObjectsAndKeys(keys,elemarray);
应该是 - &gt;
NSDictionary.FromObjectsAndKeys(elemarray,keys);
所以你实际上是使用按钮作为键。