笔记中的UIView在iPad上是零,而在iPhone上则不是零

时间:2013-02-20 22:13:39

标签: ios nib null iboutlet

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

enter image description here

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

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

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

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

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

我尝试了以下内容:

  • 检查我的NIB的文件所有者是否指向正确的视图
  • self.connectionInProgressView未指向任何其他IBOutlet
  • 检查所有其他子视图是否与违规视图相同。他们是。
  • 删除self.connectionInProgressView并在删除所有NIB连接后重新创建它。
  • 从视图中删除活动指示器并仅加载内部带有UILabel的视图。没有运气,它不是活动指标。
  • 检查VC中可能引用self.connectionInProgressView的任何代码。没有(除viewDidUnLoad中的nil语句外)。
  • 检查UINavigationControllerLoginViewController的AppDelegate属性上的属性属性类型。
  • 在AppDelegate上保留LoginViewController的副本,虽然这看起来很浪费,并且没有对结果产生影响。

[编辑2]

问题:如何加载VC

我的AppDelegate上有UINavigationController属性。 UINavigationController中的applicationDidFinishLaunchingWithOptions// 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; 中的alloc-init'd,我将VC作为根视图控制器传递给它。我此时实例化VC。

UINavigationController

请注意,虽然我稍后会将此if (self.loginViewNavigationController != nil) { [self.window.rootViewController presentViewController:self.loginViewNavigationController animated:YES completion:nil]; } 作为模式表单(不确定这是否会导致我的问题)在iPad上显示,但这仍适用于iPhone。

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

{{1}}

我正在试图确定为什么这个特定的视图拖到我的NIB上然后连接相同,因为所有其他视图在iPad上都是零而在iPhone上没有。

[编辑1] 在搜索重复的问题时,我找不到:

A few IBOutlets pointing to nil

我并不孤单!

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

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

或许你认为你只有一个XIB但是在某些时候你有一个专用的XIB for iPad被编译成NIB,即使你删除了项目中的XIB文件,专用于iPad的编译NIB仍然在构建产品。

无论如何,请尝试:

  • 清理您的项目,甚至是更好的Build Products Directory
  • 要执行后者,您可以删除您的Derived Data文件夹(“Organizer”窗口 - >“Projects”标签 - >在左侧选择您的项目 - >点击“Derived”旁边的“删除”按钮数据“)
  • 从所有模拟器中删除您的应用,只是为了确保
  • 再次构建并运行

如果这不起作用,可以帮助您调试并确定问题是否与使用不同XIB的iPad相关:

  • 您可以尝试一些测试,例如修改XIB的另一个IBOutlet,例如,从XIB中连接的视图中断开其中IBOutlet的其中一个nil ,这样当你再次运行你的应用程序时,它应该记录为nil这次。如果它是iPhone模拟器上的nil(正如你刚刚断开它所预期的那样)......但是在iPad模拟器上仍然不是nil,那么它肯定意味着你为iPhone使用不同的XIB文件和iPad。
  • 您还可以在XIB中更改已正确连接到UIView之一的IBOutlet的颜色,并查看更改是否反映在iPhone和iPad上,还是只反映在iPhone,请检查您正在编辑的XIB是否与iPad中使用的相同。

答案 1 :(得分:1)

我有类似的问题,清理了我的项目,删除了衍生数据,确保我没有使用单独的xibs用于iPad;似乎没什么用。事实证明我的问题非常简单。我正在启动我的视图控制器:

// In Swift
let vc = MyViewController()

而不是直接使用nibName:

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

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

答案 2 :(得分:0)

对于这种特定情况,我遇到了一件奇怪的事情。我有一个UITextField成为viewDidLoad的第一响应,并且我有NSNotifications挂接到那个UITextField来管理键盘框架等。但是有趣的是,当通知被发送到viewDidLoad,仅在iPad上,网点数为零(与iPhone不同)。很奇怪。