我一直在用xib文件开发所有内容,因为我们需要支持iOS4。
现在我们终于只支持iOS5和iOS6,所以我决定尝试一下故事板,所以一切都很简单,但我发现自己做了很多这样的代码:
-(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文件吗?
答案 0 :(得分:6)
我在构建我工作的最后一个应用程序中使用了Storyboard很多,是的,我同意样板代码在一段时间后变得非常烦人,但据我所知使用prepareForSegue
是唯一的方法使用segues时传递参数。
您无法从故事板本身在自定义视图控制器上指定属性/代理。
如果我必须构建一个中小型应用程序(不是太多的视图而不是它们之间的很多交叉导航),我肯定会使用Storyboard。但是当你有很多观点和它们之间的大量来回导航时,让故事板变得干净整洁真的很复杂,感觉你强迫自己使用实际上并不是最好的东西。
另一方面,我觉得故事板让你更容易从头开始感受应用程序的流程和一般外观,你甚至可以使用它们创建实际上看起来像真实的模型的事情。
因此,从本质上讲,它归结为您在启动项目时的需求。
修改强>
要考虑的另一件事:如果您使用SVN / Git或任何其他VCS与团队合作,故事板文件冲突是总婊子。
答案 1 :(得分: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美分......
答案 2 :(得分:2)
这就是野兽的本质。使用Cocoa约定的Objective-C产生 - (希望)自我记录,尽管是详细的代码。看看你的例子,我确定你的意图没有问题。
现在,如果你想使它漂亮,你可以将所有这些封装到一个宏中,以便它可以压缩到一行。虽然看起来可能更漂亮,但它肯定会增加维护野兽的不必要的复杂性。最终用户并不关心代码的漂亮程度 - 除非它阻止添加新功能。
至于讨论故事板......它们肯定是不同的,但现在使用它们已有六个月了,我很欣赏将所有笔尖放在一个集中的地方而不是花时间寻找单个文件。通过可视布局找到东西,然后解析驼峰文件名,这对我来说要容易得多。这就是我。
我的建议,给他们时间。在几个月内如果你发现它们会阻碍你的工作流程,那么一定要回到个别的笔尖。他们不会去任何地方。至少有一段时间了。
只是我的两分钱。祝好运!