3

私はIOSアプリを持っていUITabBarて、そのデリゲートを私のクラスに設定しています..didSelectTabBarItem適切に起動し、すべてがうまくいっています。UITabBarItemただし、選択したものが特定の IE の後にある場合に発生する必要がある条件付きコードがいくつかありUITabBarItemます。ユーザーがタブ バー項目 3 をクリックし、現在タブ バー項目 2 にあった場合、少し余分なコードを実行する必要があります。ユーザーがタブ バー アイテム 3 を選択し、以前はタブ バー アイテム 1 を使用していた場合は、この操作を行う必要はありません。

それで、とにかくプログラム的に(状態変数を介して私のプログラムを介して直接追跡する以外に、新しいタブバー項目が選択されたときに以前に選択された項目がタブバーにあったものを知るためにありますか?

4

5 に答える 5

5

Yes it is possible, through key-value-observing (KVO).

note This answer is in regard to a UITabBar not a UITabBarController. Tab bar controller delegates have methods you are looking for (as mentioned by rdelmar).

To start, observe your tab bar like so:

- (void)viewDidLoad{
    [super viewDidLoad];
    [self.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
}

I think you can already see where I'm going based on my using both options old & new. Then simply observe the change instead of using the delegate method, like so:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"selectedItem"] && [object isKindOfClass:[UITabBar class]]){
        UITabBar *bar = (UITabBar *)object; // The object will be the bar we're observing.
        // The change dictionary will contain the previous tabBarItem for the "old" key.
        UITabBarItem *wasItem = [change objectForKey:NSKeyValueChangeOldKey];
        NSUInteger was = [bar.items indexOfObject:wasItem];
        // The same is true for the new tabBarItem but it will be under the "new" key.
        UITabBarItem *isItem = [change objectForKey:NSKeyValueChangeNewKey];
        NSUInteger is = [bar.items indexOfObject:isItem];
        NSLog(@"was tab %i",was);
        NSLog(@"is tab  %i",is);
    } 
    // handle other observings.
}

Remember to remove yourself as observer in both viewDidUnload and dealloc, since viewDidUnload may never be called.

于 2012-09-16T07:16:59.177 に答える
2

UITabBarController を使用していない場合、これが提案された方法 (状態変数) 以外の方法で実行できるかどうかはわかりません。タブ バー コントローラーを使用している場合は、タブ バー コントローラーのデリゲートでこれを行うことができます。

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    if (viewController == [self.tabBarController.viewControllers objectAtIndex:2 && self.tabBarController.selectedIndex == 1]) {
        NSLog(@"Do special programming");
    }
    return YES;
}

このメソッドは切り替えが行われる前に呼び出されるため (UITabBar メソッドの didSelectTabBarItem とは異なり)、選択されたインデックスは、新しいタブに触れる前にアクティブだったタブのインデックスになります。

于 2012-09-16T06:13:37.960 に答える
0

より良いアイデアがあるかもしれませんが、1つの方法は、AppDelegateにNSStringオブジェクトを作成して、現在のView Controllerのクラスの名前を格納し、次のView Controllerから文字列を読み取って、前に選択した項目を確認できるようにすることです。 。

AppDelegate.hで文字列を宣言し、合成します。

@property (strong, nonatomic) NSString * preSelectedViewController;

そして、UITabViewControllerのアイテムとして設定されているすべてのUIViewControllerでこれを行います

.hファイル内

#import "AppDelegate.h"

.mファイルでは、これをviewWillAppear メソッドに含めます

AppDelegate * delegate1 =(AppDelegate *) [[UIApplication sharedApplication] delegate];
if (delegate1.preSelectedViewController ==nil) 
{
    delegate1.preSelectedViewController=NSStringFromClass( [self class]);

}

NSLog(@"previous %@",delegate1.preSelectedViewController);

//include 2nd_viewcontroller.h file and this if statement in your 3rd_viewcontroller(i.e. where you want to check and do your other programming) 
if ([delegate1.preSelectedViewController isEqualToString:NSStringFromClass([2nd_ViewController class]) ]) {
    //do your little extra code
}

delegate1.preSelectedViewController=NSStringFromClass( [self class]);
NSLog(@"present %@",delegate1.preSelectedViewController);

これはあなたのために働くと思います

于 2012-09-16T05:34:26.377 に答える
0

lastSelectedIndex を iVar に保存して、 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 両方の値を手に入れてみませんか。- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 現在選択されているView Controllerインデックスview selectedIndexを使用して(試したことがない)使用 することもできます。その後、追加のメソッドを介して、viewControllerの選択されたインデックスのインデックスを見つけることができます。

于 2012-09-16T07:23:47.877 に答える