故事板Segue标识符命名约定

Ste*_*ser 43 naming-conventions uistoryboardsegue

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

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

Ben*_*ohn 36

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

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

这是我如何命名segues ...

好的segue名字

像命名动作方法一样命名segues.根据他们的行为来命名.好的segue名称示例:

  • addUser
  • showReport
  • editAccount
  • composeMessage
  • reviewChanges

坏segue名字

避免使用 segue名称来描述被干扰的东西或它是如何工作的.

一些不好的名字的例子!! :

  • 坏名字1!- segueUserDetailViewController- 避免这个!
  • 坏名字2!- segueImageViewController- 避免这个!
  • 坏名3!- RecipeViewControllerToIngredientViewController- 避免这个!

为什么这些名字不好?

这些名称不好,因为它们明确说明了它们的实现.他们不是命名他们做什么,而是命名他们如何做.这是一种耦合形式.

所以,如果你正在做的是"展示一个购物篮",事实上,这恰好是通过呈现一个ZZBasketViewController今天,与调用者完全无关,并且只是给他们带来他们不关心的细节.也许明天它将用一个ZZShoppingItemsViewController或一个完成STSuperConfigurableStuffList.

所以:

  • 使用诸如的名称showShopping.
  • 避免使用诸如此类的名称showBasketViewController.

所有编程的命名规则

它是坏的任何抽象的名字不必要指定的东西是怎么做的,因为这样的调用者规定了如何被调用者必须工作.

这种耦合将:

  • 用不需要的知识来加重来电者的负担.
  • 以不必要的方式任意约束被调用者的实现.
  • 将呼叫者以完全无意义和昂贵的方式耦合到被呼叫者,这种方式需要维护或将来删除.

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

Segue是抽象,因此他们的名字不应该指代实现.

遵循Cocoa的标识符约定

Swift和Objective C都camelCase用于标识符.

  • 名称从不包含_-字符.
  • 除类型,类和协议外,所有名称都应使用小写首字母.

为你的segues命名camelCase并给他们一个小写的第一个字母.

不需要唯一性

Segue公司的名称并不需要是一个故事板中是唯一的.名称只需要在特定场景(视图控制器)中是唯一的.

Ilea的回答提到了这一点,引用了Ray的网站:

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

...实际上,在故事板的许多场景中使用相同的segue名称通常很有意义,因为您可以addLocation从许多场景中获得.


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

场景可以有> 1个segue到达同一个场景

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

使用 sender

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

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

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

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

这让你的prepare…方法看起来像这样:

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

避免@"stringLiterals"performSegue:通话

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

DEFINE_KEY(showReport);
DEFINE_KEY(showPDF);
DEFINE_KEY(shareReport);
Run Code Online (Sandbox Code Playgroud)

DEFINE_KEY在我的项目中.pch,看起来像这样:

#define DEFINE_KEY(keyName) static NSString *const keyName = @#keyName
Run Code Online (Sandbox Code Playgroud)

...它创建一个const NSString*变量,其值等于其名称.这static意味着它仅在此"编译单元"中可用,并且在链接时不会污染全局名称空间.

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

将unwind segues视为异常

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

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

放松命名的通常建议是这样的unwindToMessageList.这可能有意义,但是遵循"异常处理程序"这个比喻,通过它们处理的内容命名展开处理程序是非常有用的.所以unwindFromEventDetails,unwindFromReport或者unwindFromCloseupImage可能是描述被抓什么好名字.这些处理程序可以在多个可能的捕获站点实现.将使用导航层次结构自动选择适当的处理程序.


Ile*_*ian 31

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

我找了一个正式的会议,但我找不到.以下是苹果公司所说的话:

您可以在Interface Builder中为segue分配标识符.标识符是应用程序用于区分一个segue与另一个segue的字符串.例如,如果您有一个源视图控制器可以转换为两个或多个不同的目标视图控制器,您将为每个segue分配不同的标识符,以便源视图控制器的prepareForSegue:sender:方法可以区分它们并适当地准备每个segue .

Ray Wenderlich网站的另一个引用:

为segue提供唯一的标识符.(它只需在源场景中是唯一的;不同的场景可以使用相同的标识符.)

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

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

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

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

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

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


Tim*_*wan 5

"ViewControllerAToViewControllerB"
Run Code Online (Sandbox Code Playgroud)

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

"MasterToDetail"
Run Code Online (Sandbox Code Playgroud)