C# で基本的な RPN 電卓を作成しようとしています。現在、Mac アプリとして Monomac を使用して開発していますが、複数のプラットフォーム (Android を考えています) 向けに移植および開発を容易にしたいと考えました。そのために、すべてのボタンを Interface Builder で作成するのではなく、すべてプログラムで作成しています (Enter ボタン、数字を入力するフィールド、スタックが表示される領域を除く)。
これを実現するために、 というクラスを作成しましたAgnosticLayout
。アクションを実行する単一のボタンを作成する関数、またはをグループ化するand関数AgnosticLayouts
のいずれかを使用して作成できます。このクラスの重要なメソッドは です。単一の操作を に変換する方法と をグループ化する方法が与えられた場合、 type の完全なレイアウトが返されるため、ボタンを として記述でき、各プラットフォームでそれを独自の種類の GUI に変換します (Mac の場合は NSView に)。Button
Horizontally
Vertically
AgnosticLayout
Display<T>
T
T
T:
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)
);
これは醜いだけでなく、機能しません。すべてを実行すると、次のようになります。
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
これは C# ではなく ObjC の例外であると思います。つまり、プログラム自体ではなく、Cocoa がクラッシュしていることを意味します。メッセージの意味がわかりません。
主に、それらのほとんどが私が理解できない言語である ObjC 用であるため、Google で有用なソリューションを見つけられませんでした。
関連ファイル:
Calculator : 2 つの重要なクラスCalculator
(注文を受け取り、スタックを保持) と がここに存在しますAgnosticLayout
。
表示されているボタンは のものですCalculator.AgnosticLayout.DefaultLayout()
。
一意の名前を付ける方法が醜いことは知っていJoiner
ます。まだそれについては気にしていません。制約をまったく使用しないと、全体が失敗するため、適切に機能していると思います。
また、私は Haskell で長い間遊んでいて、OO の経験があまりないので、やりたいことをより慣用的な方法で行う方法があれば、私はすべて耳にします。