我已经在 NewtonScript程序员指南中查看了“View Instantiation”(第3-26页)以及“声明中的内幕故事”附录(第A-1页)和使用Macintosh编写牛顿编程中的“声明视图”部分,第2版。我相信我明白了,但我似乎无法通过点击protoFloatNGo
中的“关于”来打开protoInfoButton
窗口。
我开始使用以下应用程序(其中newtStatusBar
带有protoInfoButton
,当点击“关于”时会发送DoInfoAbout()
,并使用{{3}进行编译},在tntk
中运行,并使用Einstein探索数据结构:
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
中设置mainView
以便它在运行时可用,所以我尝试将其放在插槽中(mainView.aboutLayout
),但我当我尝试以aboutLayout
(我期望的)或GetRoot().|MyApp:MyCompany|.aboutLayout
访问它时,得到-48807(未定义的变量)错误。当然,这只会让我得到布局/模板,而不是视图。所以,我也尝试将其添加到mainView.stepChildren
,但似乎无法在GetView()
中引用它(这是NewtonScript程序员指南中记录的,并建议使用NTK的“声明为”功能)。
所以,按照“声明中的内幕故事”(我通过使用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],
};
不幸的是,在编译时,我在爱因斯坦安装软件包时遇到了“问题”,表明代码存在一些未知问题。
即使我确实让“声明为”功能正常工作,我该怎么称呼呢?我可以GetRoot().|MyApp:MyCompany|.layoutView:Open();
吗?
答案 0 :(得分: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,
}
即使我确实让“声明为”功能正常工作,我该怎么做 然后打电话给它?我可以做GetRoot()。| MyApp:MyCompany | .layoutView:Open();?
正如您在infoButtonProto中看到的,您可以使用:Parent()方法(或_parent插槽)引用应用程序本身(及其包含的所有插槽),因为该按钮是应用程序的子项。对于aboutView也是如此,它的父亲也应该是app本身。