我对在一个UIView中使用'.tags'查找子视图有疑问。
for (UIView *viewObj in [self.view subviews])
{
// want to find viewObject by its tag.
// but I heard for-switch or for-case paradigm are bad pattern design by WTF.
// there are total 9 of tags will be use for finding view object
switch (viewObj.tag)
{
case 0:
.
..
...
}
}
如何使其成为非切换或非if语句?我应该只添加到一个数组然后从那里获取?例如,您使用所需的标记添加视图并从此数组中获取。
谢谢。
答案 0 :(得分:3)
从你的评论中,它是一组非常有限的项目 - 9项。如果预计这是静态的,那么switch语句就没有什么问题。也许您可以在功能上将每个开关分解为单独的方法。也就是说,除了阵列的想法之外,命令模式可能是一种需要考虑的方法。供参考:http://en.wikipedia.org/wiki/Command_pattern
答案 1 :(得分:2)
如果它只是固定数量的视图,并且每个视图都有不同的方法需要执行,您可以直接访问视图。
UIView* someView = [self.view viewWithTag:0];
//Operations on view 0
UIView* someOtherView = [self.view viewWithTag:1];
//Operations on view 1
//...
答案 2 :(得分:1)
您可以做的一件事是让UIView
中的subviews
具有相同类型的id<YourProtocol>
,使每个符合相同的协议。然后,您可以将每个投放到UIView
并在每个{{1}}内调用相同的方法。
答案 3 :(得分:0)
为了进一步回答Shan的问题,如果你可以将它们分解为函数并将它们(函数指针)放入数组中,那么你可以使它更简单,或者你可以使用新的"Blocks"语言特色。
答案 4 :(得分:0)
有一个新的IBOutlet类型,IBOutletCollection。你将它用于NSArray,然后在IB中你可以向该出口添加视图 - 在运行时,它们都将被放入数组(无序)。
要获得你想要的特定的一个,你可以在viewDidLoad中将所有NSArray条目映射到一个由标签值键入的字典,然后只需使用“objectForKey”将它们取出。