故事板Segue标识符命名约定

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

看起来苹果在他们的例子中只使用了“ShowX”,其中X是它正在显示的视图的名称。 到目前为止,我更喜欢使用“PushX”或“ModalX”来跟踪它是哪种types的转换。 任何人有任何其他的技巧或提示?

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

我已经寻找了一个正式的会议,但我找不到任何。 以下是苹果公司的说法:

在Interface Builder中为您的赛段指定标识符。 标识符是应用程序用来区分一个segue和另一个segue的string。 例如,如果有一个源视图控制器可以inheritance两个或多个不同的目标视图控制器,则可以为每个segue分配不同的标识符,以便源视图控制器的prepareForSegue:sender:方法可以区分它们并准备好每个segue 。

Ray Wenderlich网站的另一个引用:

给segue一个唯一的标识符。 (只有在源场景中才是唯一的,不同的场景可以使用相同的标识符。)

select标识符名称的有趣方法(请参阅上面的链接了解更多):

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

  2. build立和运行! 不要在Interface Builder中填写标识符名称。 你这样做是因为你可能在一个视图控制器中有多个传出段,你需要能够区分它们。 如果在你运行的时候没有任何事情发生,并触发你正在处理的segue,那么你的segue名称标识符是唯一的,很好用。 如果代码执行一个你没有打算的segue,那么你的sague名字标识符就会产生冲突。

  3. 修复冲突 – 如果有的话。

  4. 在界面生成器中填写segue标识符,并testing它做了你想要的。

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

和编程中的大多数事情一样,你可以使用任何你喜欢的名字。

但是,与编程中的大多数事情一样, 名字很重要 , 名字很难 。

这是我如何命名赛格…

好的segue名字

名字继续,因为你会命名行动的方法 。 名字由他们将要做的事情继续下去。 好的segue名字的例子:

  • addUser
  • showReport
  • editAccount
  • composeMessage
  • reviewChanges

坏segue名称

避免使用简单的名字来描述对事物的偏见或者是如何工作的。

一些坏的赛格名称的例子

  • segueUserDetailViewController
  • segueImageViewController
  • RecipeViewControllerToIngredientViewController

为什么这些名字不好?

这些名字是不好的,因为他们明确地说明了它们的实现 他们不是指定他们做什么 ,而是指出他们 如何做 。 这是一种耦合forms。

所有编程的命名规则

任何名字(不必要地)指定怎么做是不好的,因为然后调用者规定被调用者必须如何工作。 这种耦合将会:

  • 负担知识,它不需要的来电者。
  • 任意限制被调用者的实现。
  • 将呼叫者以完全毫无意义且昂贵的方式耦合到被呼叫者,将来需要维护或删除。

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

遵循cocoa的标识符约定

Swift和Objective C都使用camelCase作为标识符。 名称不使用_- 。 除了types,类别和协议以外,所有名称都应该使用小写字母。

你应该使用小写的第一个字母来命名你的赛段。

唯一性是没有必要的

神话名称并不需要在故事板中是独一无二的。 名称只需要在特定场景(视图控制器)中是唯一的。

伊利亚的回答中提到了这一点,引用雷的网站:

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

事实上,在故事板的许多场景中拥有相同的segue名称通常是很有意义的,因为您可能能够从多个场景中添加位置。


有关命名和使用Segues的更多提示…

场景可以有> 1 segue去同一场景

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

使用sender

因为segues是由发件人调用的,所以他们非常喜欢动作消息

利用segue的senderprepareForSegue:sender:实现中configuration目标视图控制器。 这节省了暂时的状态污染你的视图控制器。

以下是处理分stream的表格视图委托的示例:

 - (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; } } 

performSegue: calls中避免@"stringLiterals"

如果你问“这个showAccount什么?你的意思是@"showAccount" ,对不对? 一个重要的提示是: 使用文件范围variables为您的segue名称。 不要使用@"string literals" 所以,在我的视图控制器的顶部,通常有这样一个块:

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

macrosDEFINE_KEY在我的项目的.pch ,如下所示:

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

…它创build一个const NSString*variables,其值等于它的名字。 static意味着它只能在这个“编译单元”中使用,不会在链接时污染全局名字空间。

如果你使用这样的variables,你的编译器就在你身边。 你不能错误的名字,因为它不会build立。 代码完成将帮助你完成一个你开始的名字。 您可以像重构其他variables一样重构一个名称。 即使是语法荧光笔在你身边!

考虑像例外情况一样放松赛段

将目标视图控制器视为unwind segue的exception处理程序。 unwind segue非常像传播堆栈的exception传播导航堆栈。 segue寻找一个展开处理程序,就像exception寻找一个exception处理程序(catch块)。 它正在寻找一个适用于unwind seguetypes的展开处理程序 – 同样,这就像正在search的exceptiontypes的exception处理程序。

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

unwind命名的通常build议就像unwindToMessageList 。 这可能是有道理的,但是按照“exception处理程序”的比喻, 通过处理它们的名称命名展开处理程序可能是非常有用的。 因此, unwindFromEventDetailsunwindFromReportunwindFromCloseupImage可能是描述被捕获内容的好名字。 这些处理程序可以在多个可能的捕获点执行。 适当的处理程序将使用导航层次自动select。

 "ViewControllerAToViewControllerB" 

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

 "MasterToDetail" 

就个人而言,我不会在前面使用animationtypes,如果您更改了animation,则需要返回代码。 但是,如果在源代码pipe理器中将segue标识符声明为常量,则可以在稍后阶段更轻松地更改名称,而无需深入代码。

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