3

我的应用程序有一个奇怪的问题。我在运行时使用名为“LoginViewController”的 NIB 加载 VC。该 NIB 有一堆对UIView放置在 NIB 中的对象的出口,如下所示:

在此处输入图像描述

在运行时,我将这些 UIView 对象作为标题动态放置在我的表格视图中。在这种情况下,每个单独UIView的(除了UITableView右边的那个)都被设置为像这样的 IBOutlet。当然,每个都有不同的名称:

@property (strong, nonatomic) IBOutlet UIView *connectionInProgressView;

现在,在我的 VCviewDidLoad方法中,我运行了所有这四个单独的视图,并通过写入日志来确保它们存在:

NSLog(@"connection in progress view: %@", self.connectionInProgressView);

我的问题是:self.connectionInProgressView在 iPad 上是 nil 而在 iPhone 上不是 nil。无论平台如何,所有其他视图都不是 nil 并且被实例化。我在 iOS 5.0、5.1 和 6.1 的模拟器中运行它。我可以在所有 iPad 模拟器上重现该问题。我的应用程序运行良好,并在 iPhone 上使用微调器加载视图,但在 iPad 上它无法加载该视图,因为它是零!为什么!?

我尝试了以下方法:

  • 检查我的 NIB 的文件所有者是否指向正确的视图
  • self.connectionInProgressView指向任何其他 IBOutlet
  • 检查所有其他子视图是否以与违规视图相同的方式连接。他们是。
  • 删除self.connectionInProgressView所有 NIB 连接后删除并重新创建它。
  • 从视图中删除活动指示器并仅加载带有UILabel内部的视图。不走运,它不是活动指示器。
  • 检查 VC 中可能引用的任何代码self.connectionInProgressView。没有(除了它的 nil 声明viewDidUnLoad)。
  • UINavigationController检查和的 AppDelegate 属性上的属性属性类型LoginViewController
  • 保留一份LoginViewController关于 AppDelegate 的副本,尽管这看起来很浪费并且对结果没有任何影响。

[编辑 2]

问题:VC是如何加载的

我的UINavigationControllerAppDelegate 上有一个属性。那UINavigationController是分配初始化的applicationDidFinishLaunchingWithOptions,我将我的 VC 作为根视图控制器传递给它。我在这一点上实例化了 VC。

// Create login/start up views
LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];

self.loginViewNavigationController = [[UINavigationController alloc] initWithRootViewController:loginViewController];

if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
    self.loginViewNavigationController.modalPresentationStyle = UIModalPresentationFormSheet;

请注意,这在 iPhone 上是有效的,尽管我稍后会UINavigationController在 iPad 上将其作为模式表单(不确定这是否会导致我的问题)呈现。

稍后在 AppDelegate 中,当一个不同的委托类抛出一个事件时,我将呈现这个 UINavigationController,我的 VC 以模态方式包含在其中。我这样做:

if (self.loginViewNavigationController != nil) {

    [self.window.rootViewController presentViewController:self.loginViewNavigationController animated:YES completion:nil];
}

我正在疯狂地试图确定为什么这个特定的视图拖到我的 NIB 上并与所有其他视图一样连接起来,在 iPad 上是 nil 而不是在 iPhone 上是 nil。

[编辑 1] 在搜索重复问题时,我没有找到这个:

一些指向 nil 的 IBOutlets

我并不孤单!

有任何想法吗?

4

3 回答 3

5

在构建通用应用程序时,您确定没有为 iPhone 和 iPad(通常)创建单独的 NIBLoginViewController.xibLoginViewController~ipad.xib

或者您可能认为您只有一个 XIB,但在某些时候您有一个专用于 iPad 的 XIB,它被编译成一个 NIB,即使您在项目中删除了 XIB 文件,编译后的 iPad 专用 XIB 仍然在构建产品中.

无论如何,请尝试:

  • 清理您的项目,甚至更好地清理您的构建产品目录
  • 要执行后者,您可以删除派生数据文件夹(“组织者”窗口 -> “项目”选项卡 -> 在左侧选择您的项目 -> 单击“派生数据”旁边的“删除”按钮)
  • 从所有模拟器中删除您的应用程序,以确保
  • 再次构建并运行

如果这不起作用,一些想法可以帮助您调试和确定问题是否与使用不同 XIB 的 iPad 有关:

  • 您可以尝试一些测试,例如修改另一个IBOutletXIB,例如断开另一个IBOutlet不在nilXIB 中连接的视图的连接,这样当您再次运行您的应用程序时,它应该被记录为nil这次。如果它nil在 iPhone 模拟器上(正如您刚刚断开它所预期的那样)......但仍然不在niliPad 模拟器上,那么这肯定意味着您为 iPhone 和 iPad 使用了不同的 XIB 文件。
  • 您还可以在 XIB 中更改UIView正确连接到您的其中一个的我们的颜色IBOutlet,并查看更改是否反映在 iPhone 和 iPad 上或仅反映在 iPhone 上,因此请检查您正在编辑的此 XIB 是否相同在 iPad 上使用与否。
于 2013-02-20T22:43:42.610 回答
1

我遇到了类似的问题,清理了我的项目,删除了派生数据,确保我没有为 iPad 使用单独的 xib;似乎没有任何效果。原来我的问题非常简单。我像这样初始化我的视图控制器:

// In Swift
let vc = MyViewController()

而不是直接使用 nibName :

let vc = MyViewController(nibName: "MyViewController", bundle: NSBundle.mainBundle())

由于我的 nil-outlet 错误似乎只在 iPad 上测试时出现,所以我从没想过检查控制器是如何初始化的。

于 2016-04-06T14:50:01.803 回答
0

对于这种特定情况,我遇到了一件奇怪的事情。我在 中UITextField成为了第一反应者viewDidLoad,并且我已经NSNotifications迷上了它UITextField来管理键盘框架等。但有趣的是,当通知在 中发送时viewDidLoad,仅在 iPad 上,插座为零(与 iPhone 不同)。奇怪的。

于 2020-10-29T15:26:45.457 回答