9

我一直在用 xib 文件开发一切,因为我们需要支持 iOS4。

现在我们终于只支持 iOS5 和 iOS6 了,所以我决定试试 storyboards,所以一切都很好,很简单,但我发现自己做了很多这样的代码:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([segue.identifier isEqualToString:@"AddPlayer"]) { //Ugly

        UINavigationController * navigationController = segue.destinationViewController;
        PlayerDetailViewController * playerDetailsViewController = [navigationController viewControllers][0]; //Super Ugly
        playerDetailsViewController.delegate = self;
    }
}

我不了解你们,但我发现这段代码非常丑陋且容易出错。

有没有更好的使用 Storyboard 的方法?我应该回到 xib 文件吗?

4

3 回答 3

6

在我工作的最后一个应用程序中,我经常使用 Storyboards,是的,我同意样板代码在一段时间后变得非常烦人,但据我所知,使用prepareForSegue是使用 segue 时传递参数的唯一方法。 您不能从 Storyboard 本身为自定义视图控制器分配属性/委托。

  • 如果我只针对 iOS 5 和 6,我会重新使用 XIB 吗?这取决于.

如果我必须构建一个中小型应用程序(没有太多的视图并且它们之间没有太多的交叉导航),我肯定会使用 Storyboards。但是当你有很多视图和它们之间的很多来回导航时,保持故事板的整洁就变得很复杂,感觉就像你在强迫自己使用实际上不是最好的东西。

另一方面,我觉得 Storyboard 让从头开始时更容易了解应用程序的流程和总体外观,您甚至可以使用它们来创建看起来像真实事物的模型。

因此,从本质上讲,它归结为您在启动项目时的需求。

编辑:

另一件需要考虑的事情:如果您使用 SVN/Git 或任何其他 VCS 与团队合作,Storyboard 文件冲突是个彻头彻尾的婊子

于 2012-10-31T20:38:38.860 回答
5

我同意这是一个丑陋的代码,为了使我的视野更加顺畅,我创建了一个宏:

#define WhenSegueIdentifierDo(segueIdentifier, block) if([segue.identifier isEqualToString:segueIdentifier]) block();

在我的prepareForSegue中:

WhenSegueIdentifierDo(kModalVC1ToVC2, ^
{
    //code
});

WhenSegueIdentifierDo(kModalVC1ToVC3, ^
{
    //code
});

我还使用常量而不是硬编码的字符串(尽管我不能在情节提要上使用它们)来保持它更漂亮。我还使用了一个约定:k +转换类型+原始视图控制器名称++目标视图控制器名称

你也可以使用

navigationController.topViewController

代替

[navigationController viewControllers][0];

只是我的2美分...

于 2013-08-01T19:53:01.157 回答
2

这就是野兽的本性。使用 Cocoa 约定的 Objective-C 产生 - (希望)自我记录,尽管是冗长的代码。看看你的例子,我确定你的意图没有问题。

现在,如果你想让它更漂亮,你可以将所有这些封装到一个宏中,这样它就会被压缩成一行。虽然看起来可能更漂亮,但它肯定会在维护野兽时增加不必要的复杂性。最终用户不会关心代码有多漂亮——除非它阻止添加新功能。

至于讨论故事板……它们肯定是不同的,但现在已经使用了六个月,我很欣赏将我所有的笔尖放在一个集中的地方,而不是花时间寻找单个文件。对我来说,通过视觉布局查找东西要容易得多,然后解析驼峰式文件名。这就是我。

我的建议,给他们时间。几个月后,如果您发现它们阻碍了您的工作流程,那么一定要回到单个笔尖。他们哪儿也不去。至少有一段时间。

只是我的两分钱。祝你好运!

于 2012-10-31T20:33:27.657 回答