Titaniumでナビゲーションバーを使った遷移をする方法二つ

TabGroupを使ったやり方と、NavigationGroupを使ったやり方がある。

TabGroupを使う

オーソドックスなやり方。

TabGroupを作成し、Tabを追加。
Tabからウィンドウを開くやり方。

Tabにナビゲーションバーで遷移する機能がついている。遷移の状態はTabごとに保持される。

app.js
var win, tab, tg;
win = Ti.UI.createWindow({url: "first.js"});
win.hideTabBar();

tab = Ti.UI.createTab({window: win});

tg = Ti.UI.createTabGroup();
tg.addTab(tab);
tg.open();

タブバーは必要がなければ隠す。

first.js
Ti.UI.currentWindow.title = "Window 1";
Ti.UI.currentWindow.backgroundColor = "#f00";

Ti.UI.currentWindow.addEventListener("click", function(){
    Ti.UI.currentTab.open(Ti.UI.createWindow({url: "second.js"}));
});

urlを指定して開いたウィンドウからはTi.UI.currentTabで現在のタブにアクセスできる。
現在のタブで新しいウィンドウを開けばそのウィンドウに遷移する。

second.js
Ti.UI.currentWindow.title = "Window 2";
Ti.UI.currentWindow.backgroundColor = "#0f0";

Ti.UI.currentWindow.addEventListener("click", function(){
    Ti.UI.currentTab.open(Ti.UI.createWindow({url: "third.js"}));
});

遷移したウィンドウのナビゲーションバーには前のウィンドウに戻るボタンが表示されている。

third.js
Ti.UI.currentWindow.title = "Window 3";
Ti.UI.currentWindow.backgroundColor = "#00f";

Ti.UI.currentWindow.addEventListener("click", function(){
    Ti.UI.currentTab.open(Ti.UI.createWindow({url: "first.js"}));
});

無限ループって怖い。

NavigationGroupを使う

ベースになるルートウインドウを作成し、そこにNavigationGroupを追加。
そのNavigationGroupからウィンドウを開くというやり方。

app.js
var rootWindow;

rootWindow = Ti.UI.createWindow();

Ti.App.nav = Ti.UI.iPhone.createNavigationGroup({
    window: Ti.UI.createWindow({url: "first.js"}) // 初期ウィンドウ
});
rootWindow.add(Ti.App.nav);

rootWindow.open();

NavigationGroupをTi.Appにくっつけてグローバルにするのが肝。

そうしないとコンテキストの違う別のウィンドウからアクセスする手段がない。
createWindowのオプションにくっつけて持ち回る手もあるが、それはあまりにめんどくさすぎる。

first.js
Ti.UI.currentWindow.title = "Window 1";
Ti.UI.currentWindow.backgroundColor = "#f00";

Ti.UI.currentWindow.addEventListener("click", function(){
    Ti.App.nav.open(Ti.UI.createWindow({url: "second.js"}));
});

Ti.App.navで新しいウィンドウを開けばそのウィンドウに遷移する。

second.js
Ti.UI.currentWindow.title = "Window 2";
Ti.UI.currentWindow.backgroundColor = "#0f0";

Ti.UI.currentWindow.addEventListener("click", function(){
    Ti.App.nav.open(Ti.UI.createWindow({url: "third.js"}));
});

遷移したウィンドウのナビゲーションバーには前のウィンドウに戻るボタンが表示されている。

third.js
Ti.UI.currentWindow.title = "Window 3";
Ti.UI.currentWindow.backgroundColor = "#00f";

Ti.UI.currentWindow.addEventListener("click", function(){
    Ti.App.nav.open(Ti.UI.createWindow({url: "first.js"}));
});

無限ルーp(ry

使い分け

普段はTabGroupを使ったやり方の方が楽。
ただ素直に考えるとNavigatoinGroupを使ったやり方の方がリソースには優しい気がする。(気がするだけで確認してはいない)

モーダルなウィンドウでナビゲーションバーを使いたい場合などケースによってはNavigationGroupを使うとうまくいく。

前の記事

seed.rbの内容をテストで使う

次の記事

Ti.APIがundefined