Objective c 在Interface Builder中为通用应用程序创建single.xib?(iOS)

Objective c 在Interface Builder中为通用应用程序创建single.xib?(iOS),objective-c,ios,xcode,interface-builder,universal,Objective C,Ios,Xcode,Interface Builder,Universal,抱歉,如果这是一个愚蠢的问题,但我做了一些谷歌搜索,所以没有找到任何人问这个确切的问题 我做iOS开发已经有一段时间了,但我对Interface Builder完全陌生。我想知道的是:有没有办法只创建一个.xib文件,然后将其用于iPhone和iPad的通用应用程序 在我看来,必须单独创建它们是愚蠢的;当我可以在代码中做一次(对屏幕大小进行微调)时,为什么在Interface Builder中要做两次以上的工作 如果我在这里遗漏/误解了什么,请告诉我。就像我说的,我是一个完全的界面构建新手:)

抱歉,如果这是一个愚蠢的问题,但我做了一些谷歌搜索,所以没有找到任何人问这个确切的问题

我做iOS开发已经有一段时间了,但我对Interface Builder完全陌生。我想知道的是:有没有办法只创建一个.xib文件,然后将其用于iPhone和iPad的通用应用程序

在我看来,必须单独创建它们是愚蠢的;当我可以在代码中做一次(对屏幕大小进行微调)时,为什么在Interface Builder中要做两次以上的工作

如果我在这里遗漏/误解了什么,请告诉我。就像我说的,我是一个完全的界面构建新手:)


编辑:我过去曾向App Store提交过非界面构建器游戏,iPhone和iPad版本完全相同,因此我不关心在每台设备上让游戏看起来/感觉有所不同。我希望它们看起来完全一样,除了由于纵横比的不同而引起的一些轻微的位置变化。

XIB是独立文件的主要原因是,苹果认为为iPhone/iPod Touch和iPad设计的UI应该分别针对每一个文件进行定制。这在他们的文章中得到了回应,其中写道:

对于视图,主要修改是重新设计视图布局以支持更大的屏幕。简单地缩放现有视图可能有效,但通常不会产生最佳结果。您的新界面应该利用可用空间,并在适当的情况下利用新的界面元素。这样做更有可能产生一个用户感觉更自然的界面,而不仅仅是大屏幕上的iPhone应用程序

虽然为一个UI维护两个XIB可能需要时间,但我觉得这比使用一个XIB然后连接大部分UI元素以便在加载XIB时以编程方式移动它们更简单。毕竟,使用两个XIB,您至少可以看到每个UI的外观,然后轻松地进行可视更改


另外,不要忘记iOS 5的故事板(),它使管理视图/视图控制器层次结构变得更简单。

如果您使用IB,您需要为iPhone和iPad创建两个单独的xib文件。您需要一个单独的iPad xib,以使您的应用程序符合苹果iPad用户界面指南。

如果您知道结果视图的外观,基于自动调整大小,您实际上只能使用一个
.xib
。如果视图只是某种共享组件,可以根据需要自动调整大小,那么它可能会派上用场。但是,如果您需要在iPad上查看与iPhone上不同的视图,只需使用两个
.xib
s即可。然后可以根据需要加载适当的一个,例如在实例初始值设定项中,如此控制器的-init:

- (id)init
{
    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {
         self = [super initWithNibName:@"YourNibForPad" bundle:nil];
    }
    else
    {
         self = [super initWithNibName:@"YourNibForPhone" bundle:nil];
    }
    if (self) { /* initialize other ivars */ }
    return self;
}
试着说出他们的名字

MyCell.xib
MyCell~ipad.xib

然后:

[self.tableView registerNib: @"MyCell" forCellReuseIdentifier: @"MyUniqueIdentifier"];

请你进一步解释一下好吗?我知道如何单独加载文件,但我不想这样做。当我创建一个新的基于视图的应用程序时,它会自动为iPad和iPhone创建一个单独的xib。如何使用一个设备并将其链接到两个设备?谢谢如果您真的、真的、真的需要,只需删除另一个xib并保留您需要的xib,然后将其名称作为参数传递给
-initWithNibName:bundle:
。还要确保从该xib加载的视图在两台设备上都能正常运行,比如自动调整大小规则等等。太棒了!这正是我想要的;我现在觉得有点傻,因为我自己没有弄明白。非常感谢你的回答!这就是我所需要的:)@ThePablick,这不起作用,因为我在同一个应用程序中对ipad和iphone有不同的目标。有什么解决方法吗?您可以通过如下命名pad和电话xib来删除userInterfaceIdiom检查。YourNib~ipad YourNib~iphone。然后您可以使用nibName执行超级初始化:@“yourNib”,iOS将确定为您加载哪一个。那么你可以做-(instancetype)init{self=[super initWIthNibName:@“yourNib”];if(self)//do stuff return self;}我非常感谢您提供的信息,并将予以考虑。但是,有没有办法只开发一个.xib文件?我个人觉得上面苹果的这句话与应用程序的关系比与游戏的关系更大(我正在与游戏合作)。所以,虽然我很欣赏并理解你所说的,但我想知道是否有可能(如果有,如何)从one.xib加载到iPhone和iPad。我无意在我的游戏中更改两台设备之间的界面,因此…复制工作似乎是浪费时间。您是否计划使用Quartz或其他绘图方法直接绘制到视图中?或者我们最好确切地知道您的UI将要做什么,如果需要连接的IB元素太多,不应该,我只是想在界面生成器中绘制出UI的基本元素,然后我将继续用代码编写游戏逻辑。我想…我的问题不是这是否明智(尽管我很欣赏这方面的信息),而是这是否可以做到,如果可以,如何做到。默认情况下,将创建两个单独的XIB。我想要一个,我想要它链接到iPhone和iPad。我可以这样做吗?如果可以,怎么做?谢谢。如果我要做一个合理的猜测,当你的应用程序目标被选中时,有一个地方需要检查:在部署信息部分下,有iPhone和iPad的主界面菜单,你可以将它们设置为相同的XIB。不过,我没有测试过。我知道这不是真的,因为我过去曾向该商店提交过非界面构建器应用程序,iPhone和iPad版本完全相同。我可能应该