iphone UIViewController 基子类未在 UINavigationController 中显示视图

Posted

技术标签:

【中文标题】iphone UIViewController 基子类未在 UINavigationController 中显示视图【英文标题】:iphone UIViewController base subclass not showing view in UINavigationController 【发布时间】:2011-06-12 17:14:01 【问题描述】:

我的想法是将 UIViewController 子类化为后续控制器的基类,目的是在我的应用委托中向 UINavigationController 添加“注销”按钮。

//MyAppDelegate.m
@synthesize navigationController; //UINavigationController

//-didFinishLaunchingWithOptions...
[self.window addSubview:navigationController.view];
...

在我的 MainWindow.xib 中,我有一个 NavigationController 附加到 ..navigationController,其中 DashboardViewController 作为其根视图控制器。

//BaseLogoutViewController.m

- (void)loadView 
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc]
                               initWithTitle:NSLocalizedString(@"Logout", @"")
                               style:UIBarButtonItemStyleBordered
                               target:self
                               action:@selector(logoutPressed)];

   self.navigationItem.rightBarButtonItem = addButton;
   [addButton release];
   [super loadView];


// -(void)logoutPressed callback implemented
// viewDidLoad, didRecieveMemoryWarning, dealloc implemented

//DashboardViewController.h
@interface DashboardViewController : BaseLogoutViewController  

DashboardViewController : UIViewController

DashboardViewController : BaseLogoutViewController

好消息是它确实显示了注销按钮,但仪表板没有显示它自己的视图。 BaseLogoutViewController 没有自己的 Nib。 我的问题是,为什么当我继承 BaseLogoutViewController 时它不再显示我的 DashboardViewController 的 视图?

【问题讨论】:

试试这个,我希望你能找到你的问题的解决方案。请阅读下面为该链接提供的所有 cmets。 ***.com/questions/4436278/uinavigation-problem 我似乎在做那个答案所说的。唯一的区别是我添加了导航控制器的子视图,它添加了仪表板的视图,因为它是在 Nib 中指定的。当我从自定义 UIViewController 类派生仪表板时会出现问题。 【参考方案1】:

你已经暗示的事情,但我想确认一下:

您要在导航控制器上推送/弹出多个视图控制器? 您希望每个视图上的注销按钮都被推送到导航控制器上?

也就是说,loadView 不是您要覆盖的内容,viewDidLoad 是您要放置上述代码的位置,

'loadView` 负责(奇怪的是)加载视图,但它没有这样做,通过覆盖它,你已经阻止它发生,你想在加载后增加视图,

【讨论】:

哇,好用。这很奇怪,因为我之前尝试过 viewDidLoad 但它没有用,也许我没有调用 [super viewDidLoad]。我也觉得奇怪的是 loadView 没有工作,尽管你说它不应该。我认为这可能是因为我的仪表板类中没有带有 [super loadView] 的 loadView;无论如何,非常感谢。 是的,在第一次尝试中放置 [super loadView] 应该可以,但由于某些深奥的原因(除了它是首选设计),我没有存储在我的颅骨中,首选实现是在 viewDidLoad地区。 aside:loadView 可以负责从 nib 加载(这可能是超类正在做的事情),或者以编程方式创建它。【参考方案2】:

尝试在您的 - (void)loadView 方法中调用 [super loadView]...这样就可以了。

【讨论】:

根据文档你不应该打电话给[super loadView]

以上是关于iphone UIViewController 基子类未在 UINavigationController 中显示视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CornerRadius 赋予 UIViewController 对象 iPhone

iPhone - 在 UIViewController 中处理触摸幻灯片

UIViewController 中的 iPhone UIPickerView

iPhone:在多线程环境中发布 UIViewController 时出现问题

如何在 iPhone 上横向绘制 UIViewController?

iPhone - 行为类似于 UIViewController 的 UIView