8

私の iPhone アプリでは、以前に表示したタブを復元するために、起動時に setSelectedIndex: を設定しました (ドキュメントに従って setSelectedViewController: も試しましたが、役に立ちませんでした)。

これは iPhone OS 3.0 では機能しますが、OS 2.x では 3 より大きいインデックス (最初の 4 つのタブ) を選択すると、必要なビューに切り替わりません。これは Apple によってここに文書化されています: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/selectedViewController

iPhone OS 2.x でビュー コントローラに切り替えることができるかどうか疑問に思っています。どんな助けでも大歓迎です。

ところで、私のシミュレーターでインデックスを 3 より大きく設定するとエラーがスローされます (iPhone OS 2.x の場合)。これを @try{..} @catch(id ..){ } ブロックでラップしました。 .

4

3 に答える 3

7

多分これが役立つでしょう。私がしたことは、選択されたタブ バー アイテムのインデックスを保存することでした。アプリが起動したら、数字が 3 より大きいかどうかを確認します。3 より大きい場合は、選択したタブ バー ビュー コントローラーをより多くのナビゲーション コントローラーに設定し、保存されたインデックス タブ バー ビュー コントローラーをより多くのナビゲーション コントローラーからプッシュします。

if ([[WSFUserDefaults sharedInstance] savedTabBarLocation] > 0) {

            if ([[WSFUserDefaults sharedInstance] savedTabBarLocation] > 3) {
                UIViewController *selectViewController = [tabBarController.viewControllers objectAtIndex:[[WSFUserDefaults sharedInstance] savedTabBarLocation]];
                [tabBarController setSelectedViewController:tabBarController.moreNavigationController];
                [tabBarController.moreNavigationController popToRootViewControllerAnimated:NO];//make sure we're at the top level More
                [tabBarController.moreNavigationController pushViewController:selectViewController animated:NO];
            }
            else {
                [tabBarController setSelectedIndex:[[WSFUserDefaults sharedInstance] savedTabBarLocation]];
            }
        }
于 2009-10-15T02:20:00.377 に答える
2

私はこれをバージョン2で動作させています。

私のコードはここにあり、うまく機能しています。

- (void)applicationDidFinishLaunching:(UIApplication *)application {

// Add the tab bar controller's current view as a subview of the window
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

[application setStatusBarStyle:UIStatusBarStyleBlackOpaque];
[window addSubview:tabBarController.view];
// Settings getLastViewIndex is just, 0,1,2,3 depending on what it was last set.
tabBarController.selectedIndex = [Settings getLastViewIndex];
于 2009-07-08T01:43:45.170 に答える
2

selectedIndexに関する UITabBarController ドキュメントは、次のように綴っています。

このプロパティは名目上、プロパティの配列へのインデックスを表し viewControllersます。ただし、選択されたビュー コントローラーが現在Moreナビゲーション コントローラーである場合、このプロパティには値が含まれますNSNotFound。このプロパティを設定すると、選択したビュー コントローラーが viewControllers配列内の指定されたインデックスにあるビュー コントローラーに変更されます。Moreナビゲーション コントローラー自体 を選択するに は、selectedViewController代わりにプロパティの値を変更する必要があります。

バージョン 3.0 より前のバージョンの iPhone OS では、このプロパティは選択されたタブ バー項目のインデックスのみを反映します。この値を、タブ バーには表示されず、代わりにMoreナビゲーション コントローラーによって管理されるビュー コントローラーのインデックスに設定しようとしても、効果はありません

私の理解が正しければ、代わりに「 selectedViewControllerプロパティの値を変更する」必要がありますが、その中の VC ではなく、 More nav コントローラーを選択することしかできません。selectedViewControllerに関する同じドキュメントから:

このビュー コントローラーは、タブ バー インターフェースによって現在表示されているカスタム ビューを持つコントローラーです。指定されたView Controllerは viewControllers配列内にある必要があります。このプロパティに新しいView Controllerを割り当てると、現在表示されているビューが変更され、タブバーで適切なタブが選択されます。ビュー コントローラを変更すると、 selectedIndexそれに応じてプロパティも更新されます。このプロパティのデフォルト値は です nil

iPhone OS 3.0 以降では、このプロパティを使用して、 viewControllersプロパティ内の任意のビュー コントローラを選択でき ます。これには、Moreナビゲーション コントローラーによって管理され、タブ バー項目がタブ バーに表示されないビュー コントローラーが含まれます。これを使用して、 moreNavigationControllerプロパティ から使用できるMore ナビゲーション コントローラー自体 を選択することもできます。iPhone OS 3.0 より前のバージョンでは、 Moreナビゲーション コントローラと、タブ バー項目が表示される View Controller のサブセットのみを選択できました。タブ バー項目が表示されていないビュー コントローラーにこのプロパティを設定しようとしても、効果がありませんでした。

回避策としては、More nav コントローラーのpushViewController:animated:メソッドがここで役立つのではないでしょうか? 各ビューに一意のタグ番号を付けます (バックグラウンドで適切な VC に関連付けることができます)。最後にアクティブだった VC のタグを保存します。

起動時に、タブ バー コントローラーで適切なビューを選択します。ビューのタグが最初の 4 つのタブ項目の VC に関連付けられていない場合は、Moreナビゲーション コントローラー内にある必要があります。VC を見つけて、それをMore nav コントローラーのスタックにプッシュし、More nav コントローラーを完全に選択します。

私はこれを試したことはありませんが、試してみる価値があるかもしれません! 唯一の潜在的な落とし穴 (そしてそれは大きな問題になる可能性があります) は、More nav コントローラーがセットアップされる前ではなく、セットアップされた後にその VC をプッシュする必要があることです。

于 2009-08-19T12:28:43.797 に答える