2

C# で基本的な RPN 電卓を作成しようとしています。現在、Mac アプリとして Monomac を使用して開発していますが、複数のプラットフォーム (Android を考えています) 向けに移植および開発を容易にしたいと考えました。そのために、すべてのボタンを Interface Builder で作成するのではなく、すべてプログラムで作成しています (Enter ボタン、数字を入力するフィールド、スタックが表示される領域を除く)。

これを実現するために、 というクラスを作成しましたAgnosticLayout。アクションを実行する単一のボタンを作成する関数、またはをグループ化するand関数AgnosticLayoutsのいずれかを使用して作成できます。このクラスの重要なメソッドは です。単一の操作を に変換する方法と をグループ化する方法が与えられた場合、 type の完全なレイアウトが返されるため、ボタンを として記述でき、各プラットフォームでそれを独自の種類の GUI に変換します (Mac の場合は NSView に)。ButtonHorizontallyVerticallyAgnosticLayoutDisplay<T>TTT: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 で有用なソリューションを見つけられませんでした。

関連ファイル:

MainWindowController

Calculator : 2 つの重要なクラスCalculator(注文を受け取り、スタックを保持) と がここに存在しますAgnosticLayout

表示されているボタンは のものですCalculator.AgnosticLayout.DefaultLayout()

一意の名前を付ける方法が醜いことは知っていJoinerます。まだそれについては気にしていません。制約をまったく使用しないと、全体が失敗するため、適切に機能していると思います。

また、私は Haskell で長い間遊んでいて、OO の経験があまりないので、やりたいことをより慣用的な方法で行う方法があれば、私はすべて耳にします。

4

1 に答える 1

0

私が何かを見ているかどうかはわかりません(この意味不明な言語で私が知っていることではありません;))しかし、あなたのエラーは、NSCopyingを採用していないNSButtonをコピーすることから来ています...

これは、ボタンをコピーしたり、オブジェクトを暗黙的に保持してキーをコピーする辞書のキーとして使用したりする場合に発生する可能性があります。

編集

あなたのパラメータはここで逆です:

NSDictionary.FromObjectsAndKeys(keys,elemarray);あるべきです - >
NSDictionary.FromObjectsAndKeys(elemarray,keys);

したがって、実際にはボタンをキーとして使用しています。

于 2013-11-11T02:09:14.513 に答える