iOS - UIViewController 的属性 navigationController 为零,即使它设置为 UINavigationController 的 rootViewControlle

Posted

技术标签:

【中文标题】iOS - UIViewController 的属性 navigationController 为零,即使它设置为 UINavigationController 的 rootViewController【英文标题】:iOS - Property navigationController of UIViewController nil even though it's set as UINavigationController's rootViewController 【发布时间】:2014-06-20 09:42:03 【问题描述】:

我正在使用故事板来构建我的应用的 UI。本质上,我将UINavigationController 作为modal 视图打开,并且在这个导航控制器中,我将rootViewController 嵌入另一个UIViewController 的实例(位置选择视图 )。这一切都是在故事板中设置的,看起来基本上是这样的:

现在,我想访问LocationSelectionViewControllerviewDidLoad 中的导航控制器,以便在导航栏中包含UISearchBarself.searchDisplayController.displaysSearchBarInNavigationBar = YES;,但这不起作用,因为我的UINavigationController 此时为零,我知道是因为我设置了一个断点并记录了它:

(lldb) po self.navigationController

nil

有谁知道为什么或我必须做什么才能在我的LocationSelectionViewController 上实际访问UINavigationController 的实例?

更新:这里有更多代码,标题实际上只包含声明

LocationSelectionViewController.h

@protocol LocationSelectionViewControllerDelegate <NSObject>
- (void)setLocation:(Location *)location;
@end

 @interface LocationSelectionViewController : UIViewController <GMSGeocodingServiceDelegate, UISearchBarDelegate, UISearchDisplayDelegate, UITableViewDataSource, UITableViewDelegate, GMSMapViewDelegate>
 @end

LocationSelectionViewController.m的部分

- (void)viewDidLoad

  [super viewDidLoad];

  self.searchBar.text = DUMMY_ADDRESS;

  self.previouslySearchedLocations = [[CoreDataManager coreDataManagerSharedInstance] previouslySearchedLocations];
  self.searchResults = [[NSMutableArray alloc] initWithArray:self.previouslySearchedLocations];

  self.mapView.delegate = self;
  self.gmsGeocodingService = [[GMSGeocodingService alloc] initWithDelegate:self];

  self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
  


- (void)viewWillAppear:(BOOL)animated

  [super viewWillAppear:animated];
  [self addMapView];

【问题讨论】:

您是否正在以编程方式初始化 LocationSelectionViewController ? 不,它是由故事板实例化的。它通过 root view 类型的 Relationship Segue 嵌入到 UINavigationController UINavigationController也被storyboard实例化了。在以 modal 视图打开它的视图控制器中,我查看了prepareSegue,可以看到SeguedestinationViewController 实际上是UINavigatoinController Destination viewController 必须是 UINavigationController ,这样没有错。 是的,我知道 ;) 这让我很困惑 【参考方案1】:

好的,我刚刚解决了我的问题。我坚信这是界面生成器中的错误。我删除了旧的导航控制器,只是将一个新的导航控制器拖放到情节提要上,现在在viewDidLoad 中调用po self.navigationController 实际上返回了UINavigationController 的一个实例。不过感谢大家的帮助,非常感谢!

【讨论】:

以上是关于iOS - UIViewController 的属性 navigationController 为零,即使它设置为 UINavigationController 的 rootViewControlle的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 5 中释放 UIviewController 对象?

iOS - 在 UINavigationController 中将 UIViewController 显示为全屏

iOS对UIViewController生命周期和属性方法的解析

为啥我的 UIViewController 被加载了两次? IOS 7

iOS5中UIViewController的新方法

在 iOS8 中未调用 UIViewController 设备旋转委托方法