我在导航视图中有一个选项卡面板作为我的初始项目。当我更改标签时,我通过以下方式更新导航栏中的标题:
activeitemchange: function(container){
var navigationView = container.up('navigationview'),
navigationBar = navigationView.getNavigationBar(),
newTabTitle = value.tab._title;
navigationBar.setTitle(newTabTitle);
}
问题在于,当我将新视图推送到导航视图时,后退按钮的文本使用旧/原始标题,而不是更新的标题。单击后退按钮还会将导航视图标题设置为旧/原始标题。
我最接近找到解决方案是这样的: http://www.sencha.com/forum/showthread.php?189284-Navigation-View-Title-(IPad-App)
但是我在navigationBar.refreshProxy()调用中遇到了'undefined'错误,所以我假设它只适用于较旧版本的ST。
任何帮助都会很棒, 感谢。
答案 0 :(得分:3)
我不知道你是否找到了这个问题的答案,或者你自己解决了这个问题,因为问题已经很久了。但我尝试了你想做的事情,我成功地获得了结果。所以这是代码。我严格遵循MVC,因此发布需要此工作的必要文件。基本上,视图和控制器。
Main.js 包含TabPanel
Ext.define('SO.view.Main', {
extend: 'Ext.tab.Panel',
xtype: 'main',
requires: [
'Ext.TitleBar',
'Ext.Video'
],
config: {
tabBarPosition: 'bottom',
items: [
{
title: 'Welcome',
iconCls: 'home',
styleHtmlContent: true,
scrollable: true,
html: [
"You've just generated a new Sencha Touch 2 project. What you're looking at right now is the ",
].join("")
},
{
title: 'Get Started',
iconCls: 'action',
items: [
{
xtype: 'button',
text: 'Push a new view!',
action:'push_new_view'
}
]
}
]
}
});
Nav.js 具有导航视图和默认项目,如上面的标签面板
Ext.define('SO.view.Nav', {
extend: 'Ext.NavigationView',
xtype: 'nav',
config:{
fullscreen: true,
items: [
{
title: 'Default View',
xtype:'main'
}
]
}
});
最后,控制器。我在控制器本身中完成了每个用户交互处理。
Ext.define('SO.controller.Nav',{
extend:'Ext.app.Controller',
config:{
refs:{
views:['SO.view.Main','SO.view.Nav'],
navView:'nav',
tabView:'main'
},
control:{
tabView:{
activeitemchange:'changeTitle'
},
'button[action=push_new_view]':{
tap:'pushNewView'
}
}
},
changeTitle:function(container,value,oldValue,eOpts ){
console.log(value.title);
this.getNavView().getNavigationBar().setTitle(value.title);
},
pushNewView:function(){
var activeTabTitle = this.getTabView().getActiveItem().title;
var controller = this;
controller.getNavView().push({
title: 'Second',
html: 'Second view!'
});
controller.getNavView().getNavigationBar().getBackButton().setText(activeTabTitle);
controller.getNavView().getNavigationBar().getBackButton().on('tap',function(self){
controller.getNavView().getNavigationBar().setTitle(activeTabTitle);
});
}
}
);
如您所见,我附加了根据changeTitle
函数中所选标签更改标题的功能。
函数pushNewView
推送新视图,让你在点击时返回按钮行为。我所做的只是,从选项卡面板中获取activeItem()
,其中包含一个按下新视图的按钮。一旦我们获得了activeItem,我们就可以获得它的标题,并且该标题需要设置为backButtnoText
。所以我遍历导航视图和getBackButton实例,只需调用setText()
方法改变后退按钮文本即可。
同时,我将事件处理程序附加到后退按钮,因为我们确实想要将导航栏标题更改为以前的标题。所以,一旦使用点击后退按钮,我们将标题设置为我们在上一步中获得的标题。一旦你完成了eveything,你可能想要分离事件处理程序,因为它可能会导致问题,或者我宁愿说它是好的。
试试这个,它只是有效。
答案 1 :(得分:0)
您需要更改父视口的标题,而不仅仅是导航视图图块。基本上,导航标题已经根据父视图标题和所有推送的组件标题自行更改。
var view = Ext.create('Ext.NavigationView', {
fullscreen: true,
items: [{
title: 'Change this title ',
items: [{
xtype: 'button',
text: 'Push a new view!',
handler: function() {
view.push({
title: 'Second Title',
html: 'Second view!'
});
}
}]
}]
});
看起来应该是这样的:
activeitemchange: function(container){
var newTabTitle = value.tab._title;
container.setTitle(newTabTitle);
}
答案 2 :(得分:0)
//viewAppt is the reference of the view
//Use this
viewAppts.query('#headerTitlebar')[0].setTitle('Title');
// Instead of this
this.getApptsHeaderTitlebar().setTitle('Title');