2017-03-29 5 views
2

2つのViewController(ControllerA、ControllerB)があり、どちらもviewWillAppearのナビゲーションバーを隠していて、viewWillDisappearのnavigationBarを表示しています。表示されます)UINavigationControllerナビゲーションバーを非表示にするとプッシュポップアップ

ここで、私はNavigationスタックでControllerAを取得し、ControllerAではControllerBをプッシュする必要があります。

プッシュアニメーションはAのviewWillDisappearを呼び出すため、アニメーションにも表示されます。バーはすぐに表示され、非表示になります。同じ問題がポップアニメーションで盛り上がっています。

この種のプッシュを行う方法& viewControllerの表示/非表示のナビゲーション設定に違いがある場合はどうでしょうか?

+0

どのコントローラーでNavigationBarを表示し、navigationBarを非表示にしますか? –

+0

両方ともA Bはバーを非表示にし、AはナビゲーションでBを押します – ximmyxiao

答えて

0

OK、私は解決策がうまく機能しているようだ、と私はそれがここに 第一希望のUIViewController

#import <UIKit/UIKit.h> 

#pragma mark Catalog Property Synthesize Support 
#import <objc/runtime.h> 
#define SYNTHESIZE_CATALOG_OBJ_PROPERTY(propertyGetter, propertySetter)                \ 
- (id) propertyGetter {                            \ 
return objc_getAssociatedObject(self, @selector(propertyGetter));                \ 
}                                 \ 
- (void) propertySetter (id)obj{                         \ 
objc_setAssociatedObject(self, @selector(propertyGetter), obj, OBJC_ASSOCIATION_RETAIN_NONATOMIC);       \ 
} 


#define SYNTHESIZE_CATALOG_VALUE_PROPERTY(valueType, propertyGetter, propertySetter)            \ 
- (valueType) propertyGetter {                          \ 
valueType ret = {0};                             \ 
[objc_getAssociatedObject(self, @selector(propertyGetter)) getValue:&ret];             \ 
return ret;                              \ 
}                                 \ 
- (void) propertySetter (valueType)value{                       \ 
NSValue *valueObj = [NSValue valueWithBytes:&value objCType:@encode(valueType)];            \ 
objc_setAssociatedObject(self, @selector(propertyGetter), valueObj, OBJC_ASSOCIATION_RETAIN_NONATOMIC);      \ 
} 

@interface UIViewController (NavigationBar) 
@property(nonatomic,assign) BOOL needBarHide; 
- (BOOL)checkPreviousControllerHideFlagInViewWillDisappear; 
@end 

のcatetory、すべてのクラスの実装で実装

#import "UIViewController+NavigationBar.h" 
@implementation UIViewController (NavigationBar) 
SYNTHESIZE_CATALOG_VALUE_PROPERTY(BOOL, needBarHide, setNeedBarHide:) 

- (BOOL)checkPreviousControllerHideFlagInViewWillDisappear 
{ 
    BOOL lastVCFlag = [self.navigationController.viewControllers lastObject].needBarHide; 
    return lastVCFlag; 
} 
@end 

へを作成し共有しましたバーを非表示にする、このようにする:(使用するinitメソッドでneedBarHideフラグを設定することに気付かなければならない)

@implementation RedViewController 

- (instancetype)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) 
    { 
     self.needBarHide = YES; 
    } 
    return self; 
} 

- (instancetype) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nil]; 
    if (self) 
    { 
     self.needBarHide = YES; 
    } 
    return self; 
} 


- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    self.delegateObject = self.navigationController.interactivePopGestureRecognizer.delegate; 
    self.navigationController.interactivePopGestureRecognizer.delegate = self; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    BOOL hide = [self checkPreviousControllerHideFlagInViewWillDisappear]; 
    [self.navigationController setNavigationBarHidden:hide animated:YES]; 
    NSLog(@"red viewWillDisappear hide:%d",hide); 

    self.navigationController.interactivePopGestureRecognizer.delegate = self.delegateObject; 
} 

@end 
関連する問題