在iOS编程中使用Storyboard而不是xib文件有什么好处?

Ste*_*eve 70 xcode interface-builder storyboard xib ios

使用Storyboard和xib文件有什么主要区别.

具体来说,使用故事板有什么优缺点

遗憾的是,尽管进行了大量的研究,我在故事板上找到的所有内容都是简单的教程,向您展示如何设置故事板,而不是具体的信息来解释它们是什么.

LJ *_*son 83

故事板是:

  • 所有场景的容器(视图控制器,导航控制器,TabBar控制器等)
  • 这些场景之间的连接和转换管理器(这些称为Segues)
  • 管理不同控制器如何相互通信的好方法
  • 通过故事板,您可以全面了解应用程序的流程,这些流程永远无法从单独的nib文件中获取.
  • 当你有几个控制器,每个控制器都有自己的nib文件时,会发生所有"混乱"的缩减器.

我一直在使用Storyboard一段时间,唯一的缺点是你不能以iOS 4或更低版本为目标.故事板仅适用于运行iOS 5或更高版本的设备.除此之外,其好处很多,而且缺点是IMO不存在.

我见过的最好的教程是Ray Wenderlich

此外,如果您是Apple Developer计划的成员,请查看故事板(iTunesU)上去年的WWDC会议,这非常棒.

另一个伟大的(也在iTunesU上)是最新的斯坦福iOS应用程序编程课程.

  • 不,看起来有人做了一些复制和粘贴.我在Danial的帖子发布前10个月在Stackoverflow上发布了这个帖子.你是对的,看起来几乎相同哈哈. (3认同)
  • 根据法律,该人只有在给予真实作者的信用时才被允许复制:)因为该内容具有创造性的公地权利.我之前做过复制粘贴,但是以正确的方式完成了.http://touchfever.blogspot.com.au/2012/06/what-is-recursion-best-explanation-in.html对于未来的复制贴纸!:) (2认同)
  • 我想补充一点,故事板有一个主要缺点 - 祝多人使用 git/svn 编辑它。即使打开故事板也常常会标记其中导致巨大冲突的变化。话虽如此,故事板对于其他一切都非常有用。 (2认同)

bra*_*ray 52

不仅有故事板的专业方面,也有缺点 - 只是因为你要求输入:

  • 在团队中使用SB并不容易,因为只有一个参与者可以同时处理SB(因为它是一个文件).

- 以下情况并非如此: - 如果你需要做SB没有提供的东西,那么将SB与编程创建的视图混合起来并不容易(嗯,虽然有可能)

经验法则似乎是:你期望你的项目越复杂,你就越不会选择SB.

编辑: - SB的另一个缺点:解决所有关于SB的XCode烦人的错误.例如,由于几个不一致而不得不频繁刷新DerivedData文件夹.有时故事板文件或其链接已损坏.那么你可能会很高兴找到问题所在.看一下这个帖子就可以了解这个想法

编辑2(2013年3月):同时Storyboards和Xcode工作得更好,文档和最佳实践广泛传播.我认为,对于大多数项目,可以推荐使用故事板,即使仍然存在一些问题.

编辑3(2013年9月):现在使用新的Xcode 5格式与SB合作可能会变得更好,因为现在似乎可以更容易合并SB代码.

另一个编辑:好吧,如果你有一个小时的时间,请坐下来,放松一下,听听这些人讨论这个话题(Ray Wenderlich&Co)

编辑2016.1:经过很长一段时间成为故事板的倡导者,我在过去的几个月里一直很麻烦,我决定尽可能地放弃故事板.原因是Apple增加了像傻瓜这样的功能,但并不关心错误和缺陷.具有大量自动布局约束的性能非常糟糕(设计时),并且容易出错的情况变得非常严重.示例:即使不那么复杂在Xcode中打开项目后,故事板也会立即进入"脏模式"(请参阅​​git状态).提示:作为初学者,您会喜欢Storyboard,因为您可以快速创建原型并在没有大量代码的情况下运行.当您进入中间状态时,您将为项目添加更多GUI代码.现在你开始在代码和SB之间来回 - 事情开始变得更糟.迟早你会倾向于在代码中执行大部分GUI工作,因为结果比拥有多个源更容易预测.


Kev*_*vin 8

摘要

笔尖/的.xib文件和故事都是被用来直观地创建用于在Xcode iOS和Mac应用程序的用户界面(我将使用的iOS术语的类作为这个问题是标签的iOS,但它也适用于Mac编程)接口生成器文件.

差异

笔尖旨在与单个一起使用UIView.它们也可以通过将UIViewControllerFile的所有者类设置为UIViewController视图插座的任何子类并连接到子类来连接到子类(使用Xcode最右侧窗格中的Connections Inspector进行拖动连接).

故事板旨在包含1个或更多的用户界面UIViewController.您可以在单个故事板中构建整个用户界面,也可以将其分成较小的部分.

好处

应始终使用故事板来支持.xib文件/ Nib(对于视图控制器).故事板具有更多功能,并由Apple积极开发.

支持Nibs的每个论据都依赖于他们单独使用的事实,而故事板包含许多场景.您可以使用UIViewControllerNibs尽可能轻松地使用单个故事板(请参阅下面的代码示例).请继续阅读详细说明和代码示例.

详细

为什么Storboards优于Nibs?

答案基本上归结为Apple鼓励使用Storyboard并将更多的开发工作投入其中.

  1. 故事板具有Nibs缺乏的缩放功能.说真的,在小笔记本电脑上设计更大的屏幕时,你无法放大Nibs.
  2. Nib缺少关键功能,如:
    • 原型和动态单元格UITableView(更多信息)
    • 顶部布局引导物业(见注释)
    • 可能还有更多,如果您要添加到此列表中,请编辑或评论
  3. 您不需要设置文件所有者类.

对故事板的基本论点是,将所有视图控制器放在一个地方会导致合并冲突,缓慢的Xcode,缓慢的构建时间以及维护对接的一般痛苦.因此,一般建议是为每个使用一个笔尖UIViewController.

但是......你可以为每个人创建故事板UIViewController.一个常见的做法(至少对我来说)是在类方法中隐藏所有UIViewController初始化(因为没有其他类需要知道控制器的Nib/Storyboard所在的文件的名称).让我们比较一下可能用来创建这种方法的相关代码片段.单行代码就是两者之间的完全差异.

Objective-C的

故事板

+ (ViewController *)create
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ViewController" bundle:nil];
    return [storyboard instantiateInitialViewController];
}
Run Code Online (Sandbox Code Playgroud)

笔尖

+ (ViewController *)create
{
    return [super initWithNibName:@"ViewController" bundle:nil];
}
Run Code Online (Sandbox Code Playgroud)

用法

- (void)showMyViewController
{
    ViewController *vc = [ViewController create];
    [self presentViewController:vc animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)

迅速

故事板

static func create() -> ViewController {
    let storyboard = UIStoryboard(name: "ViewController", bundle: NSBundle.mainBundle())
    return storyboard.instantiateInitialViewController() as! ViewController
}
Run Code Online (Sandbox Code Playgroud)

笔尖

static func create() -> ViewController {
    return ViewController(nibName: "ViewController", bundle: nil)
}
Run Code Online (Sandbox Code Playgroud)

用法

func showMyViewController() {
    let vc = ViewController.create()
    self.presentViewController(vc, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

参数

我将解决Nibs的所有常见论点; 正如我之前提到的,主要是支持单个文件,而不是作为Nib在Storyboard上的参数

  1. 团队和合并

参数:如果您正在与多人进行更改的团队合作,拥有包含大量视图控制器的故事板将导致合并冲突

响应:单个故事板不会导致合并冲突比单个Nib更多

  1. 复杂

争论:非常复杂的应用程序在故事板中有很多场景,导致一个巨大的故事板,需要永远加载,因为它的大小几乎无法理解.

回复:这是一个很好的观点,但您可以轻松地将Storyboard分解为更小的部分.故事板参考看起来像一个很棒的功能,可用于将故事板链接在一起,但它们仅在Xcode 7/iOS 9+中可用.此外,仍然没有理由在故事板上选择单个Nib.

  1. 可重用性

参数:为每个UIViewController子类创建一个Nib 可以重复使用代码,因此您不必为故事板中的每个场景设置所有约束和出口.

回应:同样,没有理由选择单个故事板上的单个Nib.


Ste*_*ton 5

几个月前在LiDG会议上发表了关于Storyboard精彩演讲.

就个人而言,我认为这是使用新应用程序的方式.有一些差距,特别是对于非常复杂的应用程序,但专业人士大多超过缺点.

  • 如果有一些更详细的东西,但不像典型的Apple东西那么狡猾,那将是一件好事. (2认同)

rai*_*ade 5

故事板的更多好处:

  • 故事板对表格视图有更好的支持。也就是说,您可以使用“动态”和“原型”单元格。
  • 使用故事板实例化视图控制器更容易。您可以执行以下操作: [se lf.storyboard instantiateViewControllerWithIdentifer:]
  • 故事板支持视图控制器容器,因此您可以以图形方式布置子视图控制器。

缺点是:

  • 当 Storyboard 包含大量视图控制器时,在 XCode 中渲染速度很慢

  • 不能为故事板中的一个视图控制器启用自动布局。


归档时间:

查看次数:

36818 次

最近记录:

7 年,5 月 前