我有一个像这样使用带 Angular NativeScript 的简单 TabView:
<TabView [(ngModel)]="tabSelectedIndex" height="300px" (selectedIndexChanged)="onSelectedIndexChanged($event)">
<StackLayout *tabItem="{title: 'Tab 1'}">
<Label text="Content in Tab 1"></Label>
</StackLayout>
<StackLayout *tabItem="{title: 'Button 1'}">
<!-- these won't be content here because clicking this should not change to a another tab, but instead should do something else. -->
</StackLayout>
<StackLayout *tabItem="{title: 'Tab 2'}">
<Label text="Content in Tab 2"></Label>
</StackLayout>
</TabView>
我想要标签栏中的一个按钮,它不会改变 View ,而是做其他事情(比如打开模式对话框)。
我尝试了一个新的 <StackLayout>
<TabView>
内外.
我还尝试使用 <AbsoluteLayout>.
所有方法都导致应用程序崩溃。
是否可以使用 selectedIndexChanged
捕获选项卡 View 更改?并阻止更改?
我试过了 stopPropagation()
在事件上但出现错误:
Property 'stopPropagation' does not exist on type 'SelectedIndexChangedEventData'.
我尝试将 View 更改回单击中间按钮时存在的 View ,但是有一个明显的闪烁,因为在触发此事件之前 View 必须更改。可以接受的是 onSelectedIndexWill Change
但该方法不存在。
onSelectedIndexChanged(args: SelectedIndexChangedEventData) {
if (args.newIndex === 1) { //the middle button
setTimeout(() => {
tabView.selectedIndex = args.oldIndex; //go back to the previous view (causes flicker)
//do stuff for the button click.
});
}
}
或者是否有另一种方法可以在标签栏中加入一个不链接到新 View 的按钮?
或者我不应该实现原生标签栏,而是从头开始创建一个导航栏?
最佳答案
针对 NativeScript 团队拒绝 export the delegates 的事实这不是你可以猴子修补的东西。唯一的方法是 fork TabView代码并使用它创建您自己的插件。
但是,一旦您有了 fork 副本,进行此更改应该相当简单。你只需要在第 64 行左右 public tabBarControllerShouldSelectViewController(tabBarController: UITabBarController, viewController: UIViewController): boolean {
您只需要检测它正在尝试加载哪个 viewController;然后在您不想实际更改 View 的情况下返回 false。 ;-)
两种可能的方式;
- 检查
owner.selectedIndex
;我相信此时它应该指向正确的新索引; - 然而,如果不是,则第二种可能的方法是根据所有者 View Controller 列表检查
viewController
(即const selectedIndex = owner._ios.viewControllers.indexOfObject(viewController);
)
关于ios - NativeScript TabView 上的叠加按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49957956/