【发布时间】:2023-04-08 21:29:01
【问题描述】:
我是 iOS 开发的 UI 部分的新手。我正在尝试创建一个通用的 iOS 应用程序。在 Xcode 4.3 中,如果使用 Single View Application 模板和通用设备系列创建项目,则会创建以下文件:AppDelegate、ViewController、ViewController_iPhone.xib 和 ViewController_iPad.xib。这些让我感到困惑,因为在以前版本的 Xcode 中,还创建了 AppDelegate 的两个子类;一个用于 iPhone,另一个用于 iPad。无论如何,例如,我有 TestAppDelegate、TestViewController、TestViewController_iPhone.xib 和 TestViewController_iPad.xib。如果我在 iPad 模拟器上运行应用程序,则会显示 TestViewController_iPad.xib。
然后我添加了 AlternateViewController。之后我创建了 AlternateViewController_iPad.xib。我选择了这个 xib 文件并将 File's Owner Custom Class 设置为 AlternateViewController 并将 Outlet 视图设置为 Objects 下的 View。我想看看我是否可以显示 AlternateViewController_iPad 所以在 TestAppDelegate 我这样做了:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if(NO){
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[[TestViewController alloc] initWithNibName:@"TestViewController_iPhone" bundle:nil] autorelease];
} else {
self.viewController = [[[TestViewController alloc] initWithNibName:@"TestViewController_iPad" bundle:nil] autorelease];
}
self.window.rootViewController = self.viewController;
}
else{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.alternateScreenController = [[[AlternateViewController alloc] initWithNibName:@"AlternateViewController_iPhone" bundle:nil] autorelease];
} else {
self.alternateScreenController = [[[AlternateViewController alloc] initWithNibName:@"AlternateViewController_iPad" bundle:nil] autorelease];
}
self.window.rootViewController = self.alternateScreenController;
}
[self.window makeKeyAndVisible];
return YES;
}
我运行了代码,但不幸的是,没有显示 AlternateViewController_iPad.xib。
我在'return YES;'上设置了一个断点部分,在调试区域中,我可以看到变量 self.window.rootViewController.nibBundle 设置为 nil。但是,如果使用 TestViewController_iPad,则变量 self.window.rootViewController.nibBundle 是 not nil。
我删除了 AlternateViewController 和 AlternateViewController_iPad.xib。然后我重新创建了它们,但现在,在“选择新文件的选项:”弹出窗口中,我将类重置为 AlternateViewController,将“子类”重置为 UIViewController,并选中“针对 iPad”和“使用 XIB 为用户界面。”为这些新文件修改了 TestAppDelegate,然后重新运行应用程序。奇怪的是,现在会显示 AlternateViewController (iPad),并且变量 self.window.rootViewController.nibBundle 是 not nil。
现在,我在这里缺少什么?错误在哪里?是我的代码还是 Xcode 4.3 ???
其他问题:
如果首先显示 TestViewController_iPad 并且那里有一个按钮,单击该按钮将显示 AlternateViewController_iPad,我该怎么做?
更新
我已经弄清楚了问题所在。发生的情况是,当在没有 xib 文件的情况下创建 ViewController 时,方法 loadView 会添加到新的 ViewController 中。据我了解,当以编程/手动方式创建视图时使用此方法。使用 xib 文件或情节提要时,必须将其删除。我删除了它,一切正常! :)
【问题讨论】:
-
AlternateViewController_iPad.xib 没有显示..你怎么确认这个??
-
您的 AlternateViewController_iPad.xib 默认可能有黑色视图?
-
@RomanTruba,基本上我在这里解释的就是我现在所拥有的一切。无论如何,我认为我现在的解决方法是创建 AlternateViewController 的子类,例如 AlternateViewController_iPad,并同时创建 XIB(选中“使用 XIB 作为用户界面”),然后将自定义类更改为 AlternateViewController。
-
我认为,你真的不需要 4 个 xib 变体,只需要一个用于 iPhone 和一个用于 iPad。然后,在应用程序启动之后,您定义用户习惯用法并添加所需的控制器。毕竟,在每个控制器中,您在“willRotateToInterfaceOrientation”中为视图控制器编写了一些坐标。祝你好运
-
好吧,我试图尽可能简单地解释这个场景。但是,该应用程序最终将有几个屏幕。不要被 ViewController (AlternateViewController) 的命名所误导。所以我真的需要创建几个xib文件。
标签: ios view xib xcode4.3 ios-universal-app