我的应用程序存在一个奇怪的问题。我在运行时使用名为“LoginViewController”的NIB加载VC。 NIB有一堆出口到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上为零。无论平台如何,所有其他视图都不是零并且是实例化的。我在iOS 5.0,5.1和6.1的模拟器中运行它。我可以在所有iPad模拟器上重现这个问题。我的应用程序运行正常,并在iPhone上使用微调器加载视图,但在iPad上它无法加载该视图,因为它是零!为什么!?
我尝试了以下内容:
self.connectionInProgressView
未指向任何其他IBOutlet self.connectionInProgressView
并在删除所有NIB连接后重新创建它。UILabel
的视图。没有运气,它不是活动指标。self.connectionInProgressView
的任何代码。没有(除viewDidUnLoad
中的nil语句外)。UINavigationController
和LoginViewController
的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
我并不孤单!
有什么想法吗?
答案 0 :(得分:5)
在构建通用应用时,您确定没有为iPhone和iPad创建单独的NIB(通常为LoginViewController.xib
和LoginViewController~ipad.xib
)吗?
或许你认为你只有一个XIB但是在某些时候你有一个专用的XIB for iPad被编译成NIB,即使你删除了项目中的XIB文件,专用于iPad的编译NIB仍然在构建产品。
无论如何,请尝试:
如果这不起作用,可以帮助您调试并确定问题是否与使用不同XIB的iPad相关:
IBOutlet
,例如,从XIB中连接的视图中断开其中IBOutlet
的其中一个nil
,这样当你再次运行你的应用程序时,它应该记录为nil
这次。如果它是iPhone模拟器上的nil
(正如你刚刚断开它所预期的那样)......但是在iPad模拟器上仍然不是nil
,那么它肯定意味着你为iPhone使用不同的XIB文件和iPad。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不同)。很奇怪。