故事板Segue标识符命名约定

时间:2013-03-12 19:15:23

标签: naming-conventions uistoryboardsegue

我正在构建一个大型故事板,我想知道是否有人提出了有用的 segue标识符的命名约定

Apple看起来只是在他们的例子中使用'ShowX',其中X是它所显示的视图的名称。到目前为止,我更喜欢使用'PushX'或'ModalX'来跟踪它的转换类型。任何人有任何其他技巧或提示?

4 个答案:

答案 0 :(得分:33)

与编程中的大多数内容一样,您可以使用任何您喜欢的名称。

但是,与编程中的大多数内容一样,names mattergood names are hard

这里是我如何命名segues ...

好的segue名称

将名称划分为您可以命名的操作方法。根据他们的行为来命名。好的segue名称示例:

  • addUser
  • showReport
  • editAccount
  • composeMessage
  • reviewChanges

错误的segue名称

避免使用 segue名称,这些名称只描述了对事物的干扰或它是如何工作的。

错误的segue名称的一些例子!!

  • 坏名字1! - segueUserDetailViewController - 避免这种情况!
  • 坏名字2! - segueImageViewController - 避免这种情况!
  • 不好的名字3! - RecipeViewControllerToIngredientViewController - 避免这种情况!

为什么这些名字不好?

这些名称很糟糕,因为它们明确说明了它们的实现。他们没有命名他们做什么,而是命名他们是如何做的。这是coupling的一种形式。

所以,如果你正在做的是"显示一个购物篮",事实上这恰好是通过今天提出ZZBasketViewController来完成的,这与调用者完全无关,只是给他们带来他们不关心的细节。也许明天可以用ZZShoppingItemsViewControllerSTSuperConfigurableStuffList来完成。

所以:

  • 使用等名称showShopping
  • 避免诸如showBasketViewController
  • 之类的名称

所有编程的命名规则

任何抽象的名称​​不必要地指定某些事情是如何完成的,这是不利的,因为调用者规定了< em> callee 必须工作。

这种耦合将:

  • 使用不需要的知识来加重来电者。
  • 以不必要的方式任意限制被叫方的实施。
  • 以完全没有意义且成本高昂的方式将来电者与被叫者联系起来,需要维护或将来删除。

如果有人随后忽略了耦合并更改了实现,那么给定的名称就会开始撒谎而会误导未来的程序员查看代码,除非名称也改变了。

Segue是抽象,所以他们的名字不应该指实现。

遵循Cocoa的标识符约定

Swift和Objective C都使用camelCase作为标识符。

  • 名称从不包含_-个字符。
  • 除了类型,类和&amp;协议,所有名称都应该有一个小写的首字母。

camelCase中为您的segues命名并给他们一个小写的第一个字母。

不需要唯一性

Segue名称需要在故事板中是唯一的。名称只需要在特定场景(视图控制器)中是唯一的。

Ilea's answer提到这一点,引自Ray的网站:

  

它只需在源场景中是唯一的;不同的场景可以使用相同的标识符。

...事实上,在故事板的许多场景中拥有相同的segue名称通常很有意义,因为你可以从许多场景中addLocation


命名和使用Segues的其他提示......

场景可以有> 1个segue到相同的其他场景

这是我使用的东西。您可能有一个视图控制器,可以显示和编辑帐户信息:AccountVC。没有什么能阻止你从一个场景中有两个或更多个segues到达相同其他视图控制器的场景:editAccountshowAccount。然后,您的prepareForSegue:sender:可以使用segue ID将AccountVC设置为适当的编辑或显示。

使用sender

因为segues是通过发件人调用的,所以他们感觉非常像动作消息

利用segue senderprepareForSegue:sender:实施中配置目标视图控制器。这可以节省污染您的视图控制器的暂时状态。

以下是处理点击的表格视图委托的示例:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  Account *const account = [self accountAtIndexPath: indexPath];
  [self performSegueWithIdentifier: showAccount sender: account];
}

这使您的prepare…方法看起来像这样:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  if([showAccount isEqualToString: segue.identifier])
  {
    AccountViewController *accountVC = segue.destinationViewController;
    accountVC.account = sender;
  }
}

@"stringLiterals"来电

中避免performSegue:

如果您要问&#34;这个showAccount是什么?你的意思是@"showAccount",对吗?&#34;。一个重要提示是:为segue名称使用文件范围变量。不要使用@"string literals"因此,在我的视图控制器的顶部,通常会出现这样的块:

DEFINE_KEY(showReport);
DEFINE_KEY(showPDF);
DEFINE_KEY(shareReport);

DEFINE_KEY位于我的项目.pch中,如下所示:

#define DEFINE_KEY(keyName) static NSString *const keyName = @#keyName

...它创建一个const NSString*变量,其值等于其名称。 static表示它仅在此&#34;编译单元&#34;中可用。并且在链接时不会污染全局名称空间。

如果你使用这样的变量,你就有了编译器。你不能错误地命名,因为它不会构建。代码完成将帮助您完成您开始的名称。您可以像修改任何其他变量一样重构名称。即使语法荧光笔也在你身边!

将unwind segues视为异常

将目标视图控制器视为展开segue的异常处理程序。展开segue向上传播导航堆栈非常像异常传播调用堆栈。 segue寻找一个unwind处理程序,就像异常查找异常处理程序一样(catch块)。它正在寻找适合于展开segue类型的展开处理程序 - 再次,这就像搜索异常类型的异常处理程序一样。

重要的是,您可以让许多视图控制器实现相同的展开处理程序。展开将像第一个处理它的视图控制器的异常一样冒泡。

unwind命名的通常建议类似于unwindToMessageList。这可能有意义,但遵循&#34;异常处理程序&#34;隐喻,通过他们正在处理的内容命名展开处理程序非常有用。因此,unwindFromEventDetailsunwindFromReportunwindFromCloseupImage可能是描述捕获内容的好名称。这些处理程序可以在多个可能的捕获站点实现。将使用导航层次结构自动选择适当的处理程序。

答案 1 :(得分:31)

这个问题没有正确的答案。这取决于口味。我减少了可读性。不要羞于为你的segue标识符命名;给出长而富有表现力的名字,因为Objective-C是一种非常冗长的语言,利用我们编写非常易读的代码。

我搜索了一个官方会议,但我找不到任何。这就是Apple所说的:

  

您可以在Interface Builder中为segue分配标识符。一个   identifier是应用程序用来区分的字符串   从另一个人的角度来看例如,如果您有源视图控制器   可以转到两个或多个不同的目标视图控制器,   你会为每个segue分配不同的标识符,以便   源视图控制器的prepareForSegue:sender:方法可以告诉   他们分开并适当地准备每个segue。

来自Ray Wenderlich's site的另一句话:

  

为segue提供唯一的标识符。 (它必须是唯一的   源场景;不同的场景可以使用相同的标识符。)

选择标识符名称的有趣方法(参见上面的链接了解更多信息):

  1. 首先编写验证segue标识符名称的代码,然后在界面构建器中设置名称。我在谈论这段代码:if ([segue.identifier isEqualToString:@"SegueIdentifierName"])

  2. Build&amp;跑!不要在Interface Builder中填写标识符名称。这样做是因为您可能有一个视图控制器的多个传出segue,您需要能够区分它们。如果在您运行并触发您正在处理的segue时没有任何反应,则您的segue名称标识符是唯一的并且可以使用。如果相反代码执行了您不想要的segue,那么您就会对sague名称标识符产生冲突。

  3. 解决冲突 - 如果有的话。

  4. 在Interface Builder中填写segue标识符并测试它是否符合您的要求。

  5. 我喜欢这个,因为它就像一个TDD方法:写一个失败的测试,写一些代码来通过失败的测试,重构,重复。

答案 2 :(得分:5)

"ViewControllerAToViewControllerB"

例如,如果您有MasterViewController和DetailViewController,则segue标识符可以是:

"MasterToDetail"

答案 3 :(得分:1)

我个人不会在前面使用动画类型,如果你改变动画,你需要回到代码。但是,如果在源控制器中将segue标识符声明为常量,则可以在以后更轻松地更改名称,而无需深入了解代码。

我通常使用我给控制器的名称,而没有“ViewController”。因此,RatingViewController将作为故事板“评级”。一个例外是展开segues,我将那些以“returnTo”开头的名称命名为目的地名称(“returnToRating”)。