自定义NavBar for Titanium上的奇怪行为

时间:2013-09-04 09:15:05

标签: javascript titanium custom-controls appcelerator navbar

首先,请不要建议我使用原生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});

initial data

当用户按下ADD按钮(您无法看到,位于表单底部)时,我使用以下代码保存数据后自动关闭导航中的窗口:

Alloy.Globals.navBar.close($.win);

如果我这样做,现在我调用另一个窗口,例如show info(右边有一个DELETE按钮),标题标签与前一个窗口混合:

Alloy.Globals.navBar.open(winPill, {animated: true});

mixed data

正如您所看到的,所有内容都是混合的,这是必须显示的内容: right image

如果我继续打开新窗户,一切都在混合。 有什么帮助可以避免这种行为?我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;
};

此外,我在GitHub中添加了一个简单且可运行的项目,只有3个空窗口用于测试。您可以看到问题here,项目为here

1 个答案:

答案 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的人可以使用。