1

NewtonScript プログラマー ガイドの「ビューのインスタンス化」(p. 3-26) と、その「宣言の裏話」付録 (p. A-1) およびNewton のプログラミングの「ビューの宣言」セクションを確認しました。 Macintosh を使用して、第 2 版。私はそれを理解していると信じていprotoFloatNGoますが、私のprotoInfoButton.

次のアプリケーション ( 「About」をクリックすると送信される を含むnewtStatusBar)から始めて、 でコンパイルし、 Einsteinで実行し、ViewFrameでデータ構造を調べています。protoInfoButtonDoInfoAbout()tntk

infoButtonView := {
    _proto: protoInfoButton,
    DoInfoAbout: func ()
        begin
            :Notify(kNotifyAlert, "MyApp", "DoInfoAbout() got called!");
        end,
    DoInfoPrefs: func ()
        begin
            :Notify(kNotifyAlert, "MyApp", "DoInfoPrefs() got called!");
        end
};

mainView := {
    _proto: protoFloater,
    viewFlags: vApplication + vVisible + vClickable,
    appSymbol: kAppSymbol,
    viewJustify: vjParentFullH + vjParentFullV,
    viewBounds: {left: 16, top: 16, right: -16, bottom: -16},
    stepChildren: [
        {
            _proto: protoTitle,
            title: kAppTitle
        },
        {
            _proto: newtStatusBar,
            menuLeftButtons: [infoButtonView],
            menuRightButtons: []
        },
    ],
};

{
    app: kAppSymbol,
    text: kAppTitle,
    theForm: mainView,
}

問題の現在の理解を説明できるかどうか見てみましょう...protoFloatNGo実行時にビューとしてインスタンス化する必要があるテンプレート/レイアウトを定義する必要があり、それへの参照を取得できる必要がありますprotoFloatNGoビュー (テンプレート/レイアウトではない)を呼び出してinfoButtonView:DoInfoAbout()呼び出すことができます:Open()

protoFloatNGo特別なことは何もありません:

{
    _proto: protoFloatNGo,
    stepChildren: [
        {
            _proto: protoTitle,
            title: "About"
        },
    ],
}

私の理解では、実行時に使用できるようprotoFloatNGoに設定する必要があるため、スロット(私が期待したもの)または。当然、それはレイアウト/テンプレートのみを取得し、ビューは取得しません。それで、私もそれをに追加しようとしましたが、 で参照する方法がないようです(これは NewtonScript Programmer's Guide に記載されており、NTK の「Declare To」機能を使用することを提案しています)。mainViewmainView.aboutLayoutaboutLayoutGetRoot().|MyApp:MyCompany|.aboutLayoutmainView.stepChildrenGetView()

そこで、「Declare の裏話」(ViewFrame を使用して Newtoban の実行中のコピーを調べて確認した) に従って、次のようにstepAllocateContext/構造を模倣しました。preAllocatedContext

mainView := {
    _proto: protoFloater,
    viewFlags: vApplication + vVisible + vClickable,
    appSymbol: kAppSymbol,
    viewJustify: vjParentFullH + vjParentFullV,
    viewBounds: {left: 16, top: 16, right: -16, bottom: -16},
    stepChildren: [
        {
            _proto: protoTitle,
            title: kAppTitle
        },
        {
            _proto: newtStatusBar,
            menuLeftButtons: [infoButtonView],
            menuRightButtons: []
        },
        {
            _proto: protoFloatNGo,
            preAllocatedContext: 'aboutView,
            stepChildren: [
                {
                    _proto: protoTitle,
                    title: "About"
                },
            ],
        },
    ],
    aboutView: nil,
    stepAllocateContext: ['aboutView, aboutView],
};

残念ながら、コンパイル中に、パッケージを Einstein にインストールするときに「問題が発生しました」というメッセージが表示され、コードに不明な問題があることが示されます。

その「Declare To」機能が機能したとしても、それをどのように呼び出すのでしょうか? できますGetRoot().|MyApp:MyCompany|.layoutView:Open();か?

4

1 に答える 1

1

ステップの子とその割り当てに関しては、コードは正しいように見えますが、なぜ機能しないのかわかりません... 同じアプローチを試しましたが、newtStatusBar を使用しませんでした。

kAppSymbol := '|ProtoTest:40Hz|;
kAppTitle := "ProtoTest";
kVersion := "1.0";

infoButtonProto := {
        _proto: protoInfoButton,
        DoInfoAbout: func ()
        begin
                if not Visible(:Parent().aboutView) then :Parent().aboutView:Open();
        end,
        DoInfoPrefs: func ()
        begin
                :Notify(kNotifyAlert, "MyApp", "DoInfoPrefs() got called!");
        end
};

aboutView := {
        preallocatedContext: 'aboutView,
        _proto: protoFloatNGo,
        viewJustify: vjParentFullH + vjParentCenterV,
        viewBounds: {left: 12, top: 0, right: -12, bottom: 220},
        stepChildren: [
                {
                        _proto: protoTitle,
                        title: "About"
                },
        ],
};

mainView := {
        _proto: protoApp,
        title: kAppTitle,
        appSymbol: kAppSymbol,

        stepChildren: [
                {
                        _proto: infoButtonProto,
                        viewJustify: vjParentRightH + vjParentBottomV + vjCenterH + vjCenterV,
                        viewBounds: {left: -39, top: -16, right: -26, bottom: -3}
                },
        ],

        aboutView: nil,
        stepAllocateContext: [
                'aboutView, aboutView
        ],


        viewJustify: vjParentFullH + vjParentFullV,
        viewBounds: {left: 16, top: 16, right: -16, bottom: -16},
};

{
        app: kAppSymbol,
        text: kAppTitle,
        theForm: mainView,
}

その「Declare To」機能が機能したとしても、それをどのように呼び出すのでしょうか? GetRoot().|MyApp:MyCompany|.layoutView:Open(); を実行できますか?

infoButtonProto でわかるように、ボタンはアプリの子であるため、:Parent() メソッド (または _parent スロット) を使用して、アプリ自体 (およびそれに含まれるすべてのスロット) を参照できます。同じことが aboutView にも当てはまり、その親もアプリ自体である必要があります。

于 2013-08-15T14:38:50.137 に答える