【问题标题】:Corrupting Navgroups in Titanium MobileTitanium Mobile 中的损坏导航组
【发布时间】:2012-09-26 18:38:18
【问题描述】:

在我的应用程序中,人们从 Window 1 到 Window 2 再到 Window 3 等等,所以导航是: 窗口 1 -> 窗口 2 -> 窗口 3

要从一个窗口转到下一个窗口,我使用导航组:

var main = Titanium.UI.createWindow({
    height:Ti.Platform.displayCaps.platformHeight,  
    width:Ti.Platform.displayCaps.platformWidth,  
    fullscreen:true, 
    navBarHidden : true,
});

var first = Ti.UI.createWindow({
    height:Ti.Platform.displayCaps.platformHeight,  
    width:Ti.Platform.displayCaps.platformWidth,  
    url:'main_windows/main.js',
    backButtonTitleImage : '../images/backb.gif',
    fullscreen:true, 
    navBarHidden : true,
});

var navGroup = Ti.UI.iPhone.createNavigationGroup({
    window:first
});

Ti.App.addEventListener('login', function(event)
{
    var lwin = Ti.UI.createWindow({
        height:Ti.Platform.displayCaps.platformHeight,  
        width:Ti.Platform.displayCaps.platformWidth,  
        url:'main_windows/login.js',
        barImage: 'images/lback.gif', 
        fullscreen:true, 
        backgroundColor: '#f7f7f7',
        navBarHidden : false,
        _parent : Titanium.UI.currentWindow,
        navGroup : navGroup,
        rootWindow : first 
    });

    navGroup.open(lwin);
});

first.navGroup = navGroup;

main.add(navGroup);

main.open();

~~~

然后在每个窗口中,我通过执行以下操作打开下一个窗口:

~~~

button1.addEventListener('click', function() {
    Ti.App.fireEvent('services', {
        zipcode : win.zipcode,
        user_id : win.user_id,
        user_uniqid : win.user_uniqid,
        user_name : win.user_name,
        user_email : win.user_email
    });
});

Ti.App.addEventListener('services', function(event) {
    var cwin = Titanium.UI.currentWindow;
    var swin = Titanium.UI.createWindow();

    swin.url = 'service.js';

    swin.zipcode = event.zipcode;
    swin.user_id = event.user_id;
    swin.user_uniqid = event.user_uniqid;
    swin.user_name = event.user_name;
    swin.user_email = event.user_email;

    swin.backgroundColor = '#f7f7f7';

    swin._parent = cwin;
    swin.navGroup = cwin.navGroup;
    swin.rootWindow = cwin.rootWindow;
    cwin.navGroup.open(swin);
});

~~~

当人们从 Window 1 -> Window 2 -> Window 3 走时,这很有效,但当他们返回时则不行:

喜欢从窗口 1 -> 窗口 2 -> 窗口 3 -> 窗口 1 -> 窗口 2

发生这种情况时,我收到以下错误:

在意外状态下完成导航转换。导航栏子视图树可能已损坏。

我能做些什么来防止这种情况发生?

【问题讨论】:

    标签: titanium titanium-mobile


    【解决方案1】:

    您正在使用createWindow 的url 属性打开多个javascript 上下文,这将很快耗尽您的系统内存,尤其是在两个以上重量级窗口的情况下。将每个窗口放入一个 CommonJS 模块中。

    这可能无法解决您的问题,但这是一种不好的做法,其副作用可能是原因。

    //Dont do this!!
    
    var first = Ti.UI.createWindow({
        ...
        url:'main_windows/main.js', // Bad, opens a new context
        ...
    });
    

    而是像这样将它放在自己的 CommonJS 模块文件中:

    // main_windows/main.js
    
    function MainWindow() {
        var self = Ti.UI.createWindow();
        // Do all the initialization you were doing to this window in 'main_windows/main.js'
        return self;
    }
    module.exports = MainWindow;
    

    像这样实例化它:

    var MainWindow = require('main_windows/main.js');
    var first = new MainWindow();
    

    这可以解决您的问题,或者至少将您的代码和资源分解为更易于管理的状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2013-02-03
      • 2023-03-09
      • 2013-10-31
      相关资源
      最近更新 更多