0

首先,请不要推荐我使用原生 iOS/Android 对象,这是一个关于自定义控件的测试,我需要它才能工作。

我在 Android 或 iOS 中使用自定义导航栏时遇到了奇怪的行为。一切似乎都是正确的,直到我在自定义导航栏中直接(通过代码)关闭一个窗口。我第二次用导航栏打开另一个窗口时,旧对象(标签、按钮等)仍然存在。我发布了一个示例:首先,在主窗口中,我在 NavBar 中调用 AddForm:

var ui = require('navigation');
var nav = ui.createNavigatorGroup();

Alloy.Globals.navBar = nav;

nav.open(winAddPill, {animated: true});

初始数据

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

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

如果我这样做,当我现在调用另一个窗口时,例如,显示信息(右侧有一个 DELETE 按钮),标题标签与前一个窗口混合:

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

混合数据

如您所见,一切都是混合的,这是必须显示的: 正确的图像

如果我继续打开新窗口,一切都还在混合。有什么帮助可以避免这种行为吗?我与这个问题斗争了 4 天,但没有找到解决方案。

最后,我正在使用的自定义导航栏:

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 个空窗口用于测试。你可以在这里看到问题,项目在这里

4

1 回答 1

0

我发现了 f* * *g 问题!!!

我详细分析了代码并找到了它。所有问题都在于总是为配置新对象准备一个新的 navView,所以,假设我们打开了 2 个窗口,然后我们有 3 个 navView。数字 3 很清楚,里面什么都没有,只是在用它打开新窗口之前准备好 setLeftButton。

但是,如果我们关闭实际窗口,使用带有对象的 navView 2,代码会生成“popNavView”,它只会删除最后一个(空的)navView 3,并将实际的 navView 2 设置为准备好使用......其中所有实际对象都在里面.

简单的解决方案是......在设置后将其删除,在 popNavBar 中使用这条简单的行:

function popNavBar() {
      navViews.pop();
      navView = navViews[navViews.length - 1];
      navView.removeAllChildren();
};

我将重新编写 github 代码,以便其他想要使用功能自定义 NavBar 的人使用它。

于 2013-09-05T09:22:03.730 回答