我正在构建一个大型故事板,我想知道是否有人提出了有用的 segue标识符的命名约定。
Apple看起来只是在他们的例子中使用'ShowX',其中X是它所显示的视图的名称。到目前为止,我更喜欢使用'PushX'或'ModalX'来跟踪它的转换类型。任何人有任何其他技巧或提示?
答案 0 :(得分:33)
与编程中的大多数内容一样,您可以使用任何您喜欢的名称。
但是,与编程中的大多数内容一样,names matter和good names are hard。
这里是我如何命名segues ...
将名称划分为您可以命名的操作方法。根据他们的行为来命名。好的segue名称示例:
addUser
showReport
editAccount
composeMessage
reviewChanges
避免使用 segue名称,这些名称只描述了对事物的干扰或它是如何工作的。
错误的segue名称的一些例子!! :
segueUserDetailViewController
- 避免这种情况!segueImageViewController
- 避免这种情况!RecipeViewControllerToIngredientViewController
- 避免这种情况!这些名称很糟糕,因为它们明确说明了它们的实现。他们没有命名他们做什么,而是命名他们是如何做的。这是coupling的一种形式。
所以,如果你正在做的是"显示一个购物篮",事实上这恰好是通过今天提出ZZBasketViewController
来完成的,这与调用者完全无关,只是给他们带来他们不关心的细节。也许明天可以用ZZShoppingItemsViewController
或STSuperConfigurableStuffList
来完成。
所以:
showShopping
。 showBasketViewController
。任何抽象的名称不必要地指定某些事情是如何完成的,这是不利的,因为调用者规定了< em> callee 必须工作。
这种耦合将:
如果有人随后忽略了耦合并更改了实现,那么给定的名称就会开始撒谎而会误导未来的程序员查看代码,除非名称也改变了。
Segue是抽象,所以他们的名字不应该指实现。
Swift和Objective C都使用camelCase
作为标识符。
_
或-
个字符。在camelCase
中为您的segues命名并给他们一个小写的第一个字母。
Segue名称不需要在故事板中是唯一的。名称只需要在特定场景(视图控制器)中是唯一的。
Ilea's answer提到这一点,引自Ray的网站:
它只需在源场景中是唯一的;不同的场景可以使用相同的标识符。
...事实上,在故事板的许多场景中拥有相同的segue名称通常很有意义,因为你可以从许多场景中addLocation
。
这是我使用的东西。您可能有一个视图控制器,可以显示和编辑帐户信息:AccountVC
。没有什么能阻止你从一个场景中有两个或更多个segues到达相同其他视图控制器的场景:editAccount
和showAccount
。然后,您的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];
}
这使您的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;中可用。并且在链接时不会污染全局名称空间。
如果你使用这样的变量,你就有了编译器。你不能错误地命名,因为它不会构建。代码完成将帮助您完成您开始的名称。您可以像修改任何其他变量一样重构名称。即使语法荧光笔也在你身边!
将目标视图控制器视为展开segue的异常处理程序。展开segue向上传播导航堆栈非常像异常传播调用堆栈。 segue寻找一个unwind处理程序,就像异常查找异常处理程序一样(catch块)。它正在寻找适合于展开segue类型的展开处理程序 - 再次,这就像搜索异常类型的异常处理程序一样。
重要的是,您可以让许多视图控制器实现相同的展开处理程序。展开将像第一个处理它的视图控制器的异常一样冒泡。
unwind命名的通常建议类似于unwindToMessageList
。这可能有意义,但遵循&#34;异常处理程序&#34;隐喻,通过他们正在处理的内容命名展开处理程序非常有用。因此,unwindFromEventDetails
,unwindFromReport
或unwindFromCloseupImage
可能是描述捕获内容的好名称。这些处理程序可以在多个可能的捕获站点实现。将使用导航层次结构自动选择适当的处理程序。
答案 1 :(得分:31)
这个问题没有正确的答案。这取决于口味。我减少了可读性。不要羞于为你的segue标识符命名;给出长而富有表现力的名字,因为Objective-C是一种非常冗长的语言,利用我们编写非常易读的代码。
我搜索了一个官方会议,但我找不到任何。这就是Apple所说的:
您可以在Interface Builder中为segue分配标识符。一个 identifier是应用程序用来区分的字符串 从另一个人的角度来看例如,如果您有源视图控制器 可以转到两个或多个不同的目标视图控制器, 你会为每个segue分配不同的标识符,以便 源视图控制器的prepareForSegue:sender:方法可以告诉 他们分开并适当地准备每个segue。
来自Ray Wenderlich's site的另一句话:
为segue提供唯一的标识符。 (它必须是唯一的 源场景;不同的场景可以使用相同的标识符。)
选择标识符名称的有趣方法(参见上面的链接了解更多信息):
首先编写验证segue标识符名称的代码,然后在界面构建器中设置名称。我在谈论这段代码:if ([segue.identifier isEqualToString:@"SegueIdentifierName"])
Build&amp;跑!不要在Interface Builder中填写标识符名称。这样做是因为您可能有一个视图控制器的多个传出segue,您需要能够区分它们。如果在您运行并触发您正在处理的segue时没有任何反应,则您的segue名称标识符是唯一的并且可以使用。如果相反代码执行了您不想要的segue,那么您就会对sague名称标识符产生冲突。
解决冲突 - 如果有的话。
在Interface Builder中填写segue标识符并测试它是否符合您的要求。
我喜欢这个,因为它就像一个TDD方法:写一个失败的测试,写一些代码来通过失败的测试,重构,重复。
答案 2 :(得分:5)
"ViewControllerAToViewControllerB"
例如,如果您有MasterViewController和DetailViewController,则segue标识符可以是:
"MasterToDetail"
答案 3 :(得分:1)
我个人不会在前面使用动画类型,如果你改变动画,你需要回到代码。但是,如果在源控制器中将segue标识符声明为常量,则可以在以后更轻松地更改名称,而无需深入了解代码。
我通常使用我给控制器的名称,而没有“ViewController”。因此,RatingViewController将作为故事板“评级”。一个例外是展开segues,我将那些以“returnTo”开头的名称命名为目的地名称(“returnToRating”)。