首先,请不要建议我使用原生iOS / Android对象,这是一个关于自定义控件的测试,我需要它才能工作。
我在Android或iOS中使用自定义Navbar时遇到了一种奇怪的行为。在我自定义navBar中直接(通过代码)关闭窗口之前,一切似乎都是正确的。 secont时间我用navBar打开另一个窗口,旧对象(标签,按钮等)仍然存在。 我发布了一个例子: 首先,在主窗口中,我在NavBar中调用AddForm:
var ui = require('navigation');
var nav = ui.createNavigatorGroup();
Alloy.Globals.navBar = nav;
nav.open(winAddPill, {animated: true});
当用户按下ADD按钮(您无法看到,位于表单底部)时,我使用以下代码保存数据后自动关闭导航中的窗口:
Alloy.Globals.navBar.close($.win);
如果我这样做,现在我调用另一个窗口,例如show info(右边有一个DELETE按钮),标题标签与前一个窗口混合:
Alloy.Globals.navBar.open(winPill, {animated: true});
正如您所看到的,所有内容都是混合的,这是必须显示的内容:
如果我继续打开新窗户,一切都在混合。 有什么帮助可以避免这种行为?我4天来一直在解决这个问题而且找不到解决办法。
最后,我正在使用的自定义navBar:
exports.createNavigatorGroup = function() {
var me = {};
var navViews = []; // A stack of navigation bars
var navView;
function pushNavBar() {
navView = Ti.UI.createView({
top: 0,
height: 44,
backgroundColor: '#BBB'
});
navViews.push(navView);
};
function popNavBar() {
navViews.pop();
navView = navViews[navViews.length - 1];
};
// Make sure we always have a navView available to prepare
pushNavBar();
me.open = function(win) {
navView.add(Ti.UI.createLabel({
text: win.title,
color: 'black'
}));
navView.win = win;
win.add(navView);
win.navBarHidden = true;
win.open();
// Prepare for the next window
pushNavBar();
};
me.close = function(win) {
if (navViews.length > 1) {
// Close the window on this nav
popNavBar();
win.close();
}
};
return me;
};
答案 0 :(得分:0)
我发现f * * * g问题!!!
我详细分析了代码并找到了它。所有问题都在于新的navView总是为配置新对象做好准备,所以,比方说,我们打开了2个窗口,然后我们有3个navViews。数字3很清楚,里面什么也没有,只是在打开新窗口之前准备好setLeftButton。
但是如果我们关闭实际窗口,使用带有对象的navView 2,代码会生成“popNavView”,只删除最后一个(空)navView 3并将实际navView 2设置为准备使用... 包含所有实际对象。
简单的解决方案是......在设置之后删除它,在popNavBar中使用这个简单的行:
function popNavBar() {
navViews.pop();
navView = navViews[navViews.length - 1];
navView.removeAllChildren();
};
我将重新执行github代码,让其他想要使用功能定制NavBar的人可以使用。