故事板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标识符名称的有趣方法(请参阅上面的链接了解更多):
-
首先编写validationsegue标识符名称的代码,然后在界面构build器中设置名称。 我在说这个代码:
if ([segue.identifier isEqualToString:@"SegueIdentifierName"])
-
build立和运行! 不要在Interface Builder中填写标识符名称。 你这样做是因为你可能在一个视图控制器中有多个传出段,你需要能够区分它们。 如果在你运行的时候没有任何事情发生,并触发你正在处理的segue,那么你的segue名称标识符是唯一的,很好用。 如果代码执行一个你没有打算的segue,那么你的sague名字标识符就会产生冲突。
-
修复冲突 – 如果有的话。
-
在界面生成器中填写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,这些场景会转到这个相同的其他视图控制器的场景: editAccount
和showAccount
。 您的prepareForSegue:sender:
然后可以使用segue ID设置适当的AccountVC
编辑或只是显示。
使用sender
因为segues是由发件人调用的,所以他们非常喜欢动作消息 。
利用segue的sender
在prepareForSegue: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处理程序”的比喻, 通过处理它们的名称来命名展开处理程序可能是非常有用的。 因此, unwindFromEventDetails
, unwindFromReport
或unwindFromCloseupImage
可能是描述被捕获内容的好名字。 这些处理程序可以在多个可能的捕获点执行。 适当的处理程序将使用导航层次自动select。
"ViewControllerAToViewControllerB"
例如,如果您有MasterViewController和DetailViewController,则segue标识符可以是:
"MasterToDetail"
就个人而言,我不会在前面使用animationtypes,如果您更改了animation,则需要返回代码。 但是,如果在源代码pipe理器中将segue标识符声明为常量,则可以在稍后阶段更轻松地更改名称,而无需深入代码。
我通常使用我给控制器的名字,没有“ViewController”。 所以RatingViewController将作为故事板的“评级”。 一个例外是展开顺序,我将那些以“returnTo”开头的名称命名为destination(“returnToRating”)。