Ios nib中的UIView在iPad上是零,而在iPhone上不是零
我的应用程序有一个奇怪的问题。我在运行时用一个名为“LoginViewController”的NIB加载一个VC。该NIB有一系列到Ios nib中的UIView在iPad上是零,而在iPhone上不是零,ios,nib,null,iboutlet,Ios,Nib,Null,Iboutlet,我的应用程序有一个奇怪的问题。我在运行时用一个名为“LoginViewController”的NIB加载一个VC。该NIB有一系列到UIView对象的出口,这些对象放置在NIB中,如下所示: 在运行时,我将这些UIView对象作为标题动态地放置在表视图中。在这种情况下,每个单独的UIView(右侧带有UITableView的除外)都设置为IBOutlet,如下所示。当然,每个都有不同的名称: @property (strong, nonatomic) IBOutlet UIView *conn
UIView
对象的出口,这些对象放置在NIB中,如下所示:
在运行时,我将这些UIView对象作为标题动态地放置在表视图中。在这种情况下,每个单独的UIView
(右侧带有UITableView
的除外)都设置为IBOutlet,如下所示。当然,每个都有不同的名称:
@property (strong, nonatomic) IBOutlet UIView *connectionInProgressView;
现在,在我的VC的viewDidLoad
方法中,我运行了这四个独立的视图,并通过写入日志确保它们存在:
NSLog(@"connection in progress view: %@", self.connectionInProgressView);
我的问题是:self.connectionInProgressView
在iPad上是零,而在iPhone上不是零。不管平台如何,所有其他视图都不是nil,而是实例化的。我在iOS 5.0、5.1和6.1的模拟器上运行这个。我可以在所有iPad模拟器上重现这个问题。我的应用程序工作正常,在iPhone上用微调器加载视图,但在iPad上它无法加载视图,因为它是零!为什么
我尝试了以下方法:
- 检查NIB文件的所有者是否指向正确的视图
不指向任何其他IBOutletself.connectionInProgressView
- 检查所有其他子视图的连接方式是否与有问题的视图相同。是的
- 删除
并在删除其所有NIB连接后重新创建它self.connectionInProgressView
- 从视图中删除活动指示器并仅加载内部带有
ui标签的视图。运气不好,这不是活动指标
- 检查VC中是否有可能引用
的代码。没有(除了self.connectionInProgressView
中的nil语句)viewDidUnLoad
- 正在检查
和UINavigationController
的my AppDelegate属性上的属性类型LoginViewController
- 在AppDelegate上保留
的副本,尽管这似乎是浪费,并且不会对结果产生影响LoginViewController
UINavigationController
,它是我的AppDelegate上的一个属性。该UINavigationController
在applicationdifinishlaunchingwithoptions
中被alloc init'd,我将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上是有效的,尽管我稍后会在iPad上以模式表单的形式(不确定这是否导致我的问题)呈现此UINavigationController
稍后在AppDelegate中,当一个不同的委托类抛出一个事件时,我将展示这个UINavigationController,其中包含我的VC。我是这样做的:
if (self.loginViewNavigationController != nil) {
[self.window.rootViewController presentViewController:self.loginViewNavigationController animated:YES completion:nil];
}
我简直要发疯了,我想知道为什么这个特定的视图拖到我的笔尖上,然后和其他视图一样连接在一起,在iPad上是零,而在iPhone上不是零
[编辑1]
在搜索重复问题时,我未能找到以下内容:
我并不孤单
有什么想法吗?当你正在构建一个通用应用程序时,你确定没有为iPhone和iPad创建一个单独的NIB(
LoginViewController.xib
和LoginViewController~iPad.xib
通常)
或者,您可能认为您只有一个XIB,但在某个时候,您有一个专用于iPad的XIB,它被编译成了NIB,即使您在项目中删除了XIB文件,编译后的专用于iPad的NIB仍在构建产品中
在任何情况下,请尝试:
- 清理您的项目,或者更好地清理您的构建产品目录
- 要执行后者,您可以删除衍生数据文件夹(“管理器”窗口->“项目”选项卡->选择左侧的项目->单击“衍生数据”旁边的“删除”按钮)
- 从所有模拟器中删除你的应用程序,以防万一
- 重新构建并运行
- 您可以尝试一些测试,例如修改您的XIB的另一个
,例如,从它在XIB中连接到的视图中断开另一个IBOutlet
,这样当您再次运行应用程序时,它应该被记录为IBOutlet
。如果它在iPhone模拟器上是nil
(正如您刚刚断开连接时所预期的那样)…但在iPad模拟器上仍然是非nil
,那么它肯定意味着您对iPhone和iPad使用了不同的XIB文件nil
- 您还可以在XIB中更改您的
的颜色,该视图已正确连接到您的UIView
,并查看更改是否反映在iPhone和iPad中,还是仅反映在iPhone上,因此请检查您正在编辑的此XIB是否与iPad中使用的相同IBOutlet
// In Swift
let vc = MyViewController()
不要直接使用nibName:
let vc = MyViewController(nibName: "MyViewController", bundle: NSBundle.mainBundle())
由于我的nil outlet错误似乎只是在iPad上测试时出现的,所以我从未想过要检查控制器是如何初始化的。在这个特定的情况下,我遇到了一件奇怪的事情。我有一个
UITextField
成为viewDidLoad
中的第一个响应,我有NSNotifications
连接到UITextField
来管理键盘框等。但有趣的是,当通知在viewDidLoad
中发送时,只有在iPad上,插座是零的(与iPhone不同)。奇怪。iPhone和iPad有不同的目标吗?如果是这样的话,这个nib是否同时针对这两者?你有这个问题吗