1

UITabBarController のデリゲートを設定し、次のデリゲート メソッドを用意しました。

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {    
        [self.navigationController popToRootViewControllerAnimated: YES];
        return NO;
}

メソッドが起動し、コンテキスト内で、テーブル ビューの 1 つまたは 2 つのレベルになります。ルート ビュー コントローラーは正しく表示されますが、ナビゲーション バーはリセットされず、1 つまたは 2 つのレベルからテーブル ビューに「戻る」ボタンがまだあります。

(上記のデリゲート メソッドは、アプリでやろうとしていることを簡略化したものですが、それでも問題が発生します。アプリでは、元のタブに戻ったときにルート ビューを表示する必要があるため、ポップしようとしています。私が去る前にルートビューに)。

popToRootViewControllerAnimated が正しく機能しないということは、タイムラグの問題を示唆していますが、私の場合はそうではないようです。shouldSelectViewController を実行する前に、必要なだけ待つことができますが、ナビゲーション バーの「戻る」ボタンはまだめちゃくちゃです。

デリゲートは次のとおりです。

@interface BasicPlaceItemComment : UIViewController<UIAlertViewDelegate, UITabBarControllerDelegate> {
    // data members ommitted
} 

これは、すべてのテーブル ビューの派生元のクラスです。

4

2 に答える 2

0

メソッドが正しいコンテキストにあることを確認しますか?TabBarDelegateに準拠しているのは誰ですか?AppDelegateの場合、self.navigationControllerはnilである可能性があります。TabBarを使用していて、複数のナビゲーションコントローラーがある場合は、間違ったコントローラーでpopToRootViewControllerを呼び出している可能性があります。これを挿入してみてください:

NSLog(@"%@", self.navigationController);

メソッドの最初に、正しいナビゲーションコントローラーのアドレスを取得していることを確認してください。

さらにコードを投稿すると役立つ場合があります。

于 2012-11-01T23:41:45.743 に答える
0

問題は、別の問題を解決するために UINavigationController をサブクラス化していたことにあるようです。このサブクラスを削除すると、問題はなくなります。つまり、UINavigationController をサブクラス化せずに popToRootViewController を実行しても、「戻る」ボタンが乱れることはなくなりました。しかし、これは別の問題を引き起こします。UINavigationController と UINavigationBarDelegate.ShouldPopItem() に記載されている問題を MonoTouch で解決するために、UINavigationController をサブクラス化していました。

ナビゲーション バーとタブ バーの両方で、「終了してもよろしいですか?」というメッセージを表示できるようにしたいと考えています。表示されたビューの一部のデータが変更された場合に、[戻る] ボタン (または別のタブ) が押されたときに警告します (そのビューから移動する前、およびそのビューから移動することをキャンセルする可能性があります)。

したがって、これは部分的な答えですが、私の問題はまだ残っています。ユーザーが戻るボタンまたは別のタブを入力したときに制御を取得する手段が必要です。1) UINavigationBarDelegate メソッド shouldPopItem の UINavigationController とは異なるデリゲートを持つ手段、または 2) UINavigationController をサブクラス化するが、タブをクリックしたときに現在起こっているように [戻る] ボタンを台無しにしない手段popToRootViewController を呼び出します。

さらに考えますか?

11/3/12 の詳細

問題を引き起こしたのは、それ自体が UINavigationController のサブクラス化ではありません。デリゲート メソッドから誤って NO を返していました

// This method returns true when the navigation bar should pop an item
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {

popToRootViewController を実行したとき。UINavigationController サブクラスに次のメソッドがあります。

- (void) popToRoot {
    regularPop = YES;
    [self popToRootViewControllerAnimated: YES];
}

これにより、shouldPopItem は YES を返します。これを popToRootViewController の代わりに使用します。私の問題のほとんどが解決されました!

于 2012-11-03T01:43:58.147 に答える