1

我已经阅读了NewtonScript 程序员指南中的“视图实例化”(第 3-26 页)以及它的“声明的内幕”附录(第 A-1 页)和Newton 编程中的“声明视图”部分使用 Macintosh,第 2 版。我相信我理解它,但我似乎无法通过protoFloatNGo单击我的protoInfoButton.

我从以下应用程序开始(它有一个newtStatusBarwith ,当点击“About”时protoInfoButton它会发送DoInfoAbout()),编译tntk,在Einstein中运行,并使用ViewFrame探索数据结构:

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在 my中设置mainView它以便它在运行时可用,所以我尝试将它放在一个插槽 ( mainView.aboutLayout) 中,但是当我尝试将它访问为aboutLayout(我预期的)或GetRoot().|MyApp:MyCompany|.aboutLayout。自然,这只会让我得到布局/模板而不是视图。因此,我也尝试将它添加到mainView.stepChildren,但似乎无法在其中引用它GetView()(这是 NewtonScript Programmer's Guide 中的文档,并建议使用 NTK 的“Declare To”功能)。

因此,按照“The Inside Story on 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 回答