【问题标题】:iPhone SDK: Can't specify view to Navigation ControlleriPhone SDK:无法指定导航控制器的视图
【发布时间】:2010-07-31 22:37:18
【问题描述】:

我正在开发我的第一个 iPhone 应用程序并取得了良好的进展。但有一件事我就是不明白。

当我的应用启动时,它会显示一个带有一些功能的 UIView。这工作正常。该屏幕上的一个按钮应该加载一个包含导航控制器的新视图(HistoryViewController)。

问题是……每当加载 HistoryViewController 时,应用程序就会因为没有视图而崩溃。这是真的,因为在 xib 文件中我无法将文件所有者的视图连接到任何东西: http://www.freeimagehosting.net/image.php?1a3caa8b8d.png

我肯定在某处缺乏知识,但经过数小时的研究,我无法解决这个问题。

有什么提示吗? 谢谢!

【问题讨论】:

    标签: iphone objective-c controller navigation


    【解决方案1】:

    通常你会:

    • 单击该底线(历史表视图控制器,“HTVC”)并在检查器窗口中指定一个 NIB 名称 - 这意味着您首先必须创建一个新的 NIB。

    • 双击该底线 (HTVC),弹出 320x480 预览窗口,然后从库中拖入一个 UIView。

    使用第一种方法,您告诉视图控制器动态加载 NIB 作为要连接的视图,使用第二种方法,您使用 IB 为视图控制器执行此操作。然后,您拖入的视图将显示为该底线 (HTVC) 的子视图。

    编辑以实际加载您创建的 nib 文件,执行此操作以推送视图控制器:

        UIViewController *controller = [[UIViewController alloc] autorelease];
        [controller initWithNibName:@"nibfilename" bundle:nil];
        [self.navigationController pushViewController:controller animated:YES];
    

    将 UIViewController 替换为您自己的视图控制器类(如果需要),并将 nibfilename 替换为 nib 的文件名(减去扩展名!)

    【讨论】:

    • 好提示,谢谢!但我还没到。也许你可以再帮忙?在 IB 中定义的内容:freeimagehosting.net/image.php?89f98c9824.png 我在 iPhone 中得到的内容:freeimagehosting.net/uploads/4721d096b0.png 显然与未显示导航栏项目不同,HistoryTableViewController 的内容也不相同(在普通的基于导航的应用程序中工作正常) .每一点帮助表示赞赏! :) 谢谢!
    • 你有点走捷径——你必须做我在底部行所说的事情,历史表视图控制器。以为我提到了 3 次?!
    • 嗯……我想我都做到了(但之前发布了错误的图片)。这是在 IB 中:freeimagehosting.net/uploads/3a620c6238.png 但我仍然得到空白屏幕:freeimagehosting.net/uploads/4721d096b0.png 感谢您的帮助。我真的被困在这里了……
    • 感谢您的更新。现在,当我单击按钮时,什么都没有发生,甚至控制台上的条目也没有。无论如何,非常感谢您的耐心和帮助。我现在去睡一觉,希望明天会好起来:) - 凌晨 1.30 点在欧洲这里。
    • @mdvs - 你的回答没有解释任何事情,但你没有解释为什么他需要以某种方式这样做。这就是我认为当你开始时代码路线更好的方式 - 你了解事情是如何工作的,然后你就可以理解 IB。
    【解决方案2】:

    很难说出你的问题到底是什么,但我会提供一些建议。

    在界面生成器中创建导航控制器(或标签控制器)时,很容易不了解实际发生的情况,所以我的建议是暂时放弃界面生成器,让我们在代码中构建它。

    一般来说,我真的不喜欢在界面构建器中构建 UI 导航控制器或选项卡视图控制器,我真的只是更愿意自己构建视图并在代码中创建 UINavigationController。

    您有一个视图,它显示了您希望包含在 UINavigationController 中的 HistoryTableViewController,因此执行此操作的代码是:

    - (void) showHistory 
    {
          HistoryViewController *historyVC = [[HistoryViewController alloc] init];
          // If you create historyviewcontroller in nib
          // HistoryViewController *histroyVC [[HistoryViewController alloc] initWithNibName:@"myNib" bundle:nil];
    
          UINavigationController *navController = [[UINavigationController alloc] initWithRootController:histroyViewController];
          [self presentModalViewContoller:navController animated:YES];
    }
    

    这将创建一个导航控制器,将您的历史视图控制器显示为根视图控制器。再简单不过了。

    【讨论】:

    • 感谢您的快速回复!嗯……这正是我拥有的代码。现在发生了我之前对答案的评论:在 IB 中定义的内容:freeimagehosting.net/image.php?89f98c9824.png // 我在 iPhone 中得到的内容:freeimagehosting.net/uploads/4721d096b0.png
    • IB 是一个完美的工具,可以让您快速做好事情。不必要的程序化创建事物可能没有优化并且容易出现其他问题。例如内存泄漏,您的代码示例的作用。 每个alloccopy 后面都应该跟一个releaseautorelease
    • @Manuel:请参阅我关于如何加载您创建的 nib 文件的更新答案。
    • @mvds 是的,我知道它正在泄漏。稍后我会处理的。
    • 当您了解事物的运作方式时,IB 是完美的。当您只使用 IB 构建东西时,很难理解它。是的,我的示例泄漏了,但这并不是要使用它,它只是一个示例,以了解 UINavigationController 的工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多