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
的实例(位置选择视图 )。这一切都是在故事板中设置的,看起来基本上是这样的:
现在,我想访问LocationSelectionViewController
的viewDidLoad
中的导航控制器,以便在导航栏中包含UISearchBar
:
self.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
,可以看到Segue
的destinationViewController
实际上是UINavigatoinController
。
Destination viewController 必须是 UINavigationController ,这样没有错。
是的,我知道 ;) 这让我很困惑
【参考方案1】:
好的,我刚刚解决了我的问题。我坚信这是界面生成器中的错误。我删除了旧的导航控制器,只是将一个新的导航控制器拖放到情节提要上,现在在viewDidLoad
中调用po self.navigationController
实际上返回了UINavigationController
的一个实例。不过感谢大家的帮助,非常感谢!
【讨论】:
以上是关于iOS - UIViewController 的属性 navigationController 为零,即使它设置为 UINavigationController 的 rootViewControlle的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 5 中释放 UIviewController 对象?
iOS - 在 UINavigationController 中将 UIViewController 显示为全屏
iOS对UIViewController生命周期和属性方法的解析