我注意到在使用UITableView,UICollectionView,UIPickerView,UIScrollView,...以及许多其他UIKit类时,包含对象实例的UIViewController通常承担DataSource和Delegate的角色。
我从Apple的文档中了解了这些数据源和委托方法的调用,以及如何实现它们......用于每个类的单个实例。
我的问题是,你如何在同一个UIViewController中处理不同的实例?例如,如果我有两个UICollectionViews,或三个UIPickerViews,....,或五十个UIScrollViews?我每个UIViewController只能实现一次数据源方法,但我不得不告诉程序不同的指令?
我唯一可以设想的是一个巨大的switch语句或一堆级联的if-else if-else将委托或数据源方法的输入与UIViewController中的每个对象实例进行比较,这可能会失控。有很多。
答案 0 :(得分:2)
虽然我们习惯使用视图控制器作为委托,但是没有必要这样做。您实际上可以创建符合相关委托协议的NSObject
子类。然后,您可以实例化这些对象,并根据需要将它们用作UI对象(或其他)的委托。
例如,考虑一个场景,其中我有两个文本字段,一个只允许数值,另一个不接受数值。我可以为每种类型的文本字段编写一个单独的委托对象。
如果以编程方式实现此操作,我将手动实例化两个委托对象,在我的视图控制器中保留对它们的一些强引用,然后在viewDidLoad
中我可以将每个文本字段的委托设置为合适的委托对象。
如果在Interface Builder中执行此操作,您实际上可以将“对象”从“对象库”拖动到场景中(在场景上方的栏中或场景左侧的文档轮廓):
然后,您可以指定此对象的类:
对所有委托对象重复此操作:
最后,您可以转到文本字段并通过控制拖动到添加到场景中的委托对象来指定委托:
在Interface Builder中执行它意味着它完全负责为我委托该委托对象的实例化,我不得不在视图控制器的代码中做任何事情。
最重要的是,如果您想要UI对象的不同行为,您可以实例化一个单独的委托对象,该对象显示所需的行为,并将其用作UI对象的委托。这种实例化单独委托对象的模式在iOS 7自定义转换(我们有各种各样的委托对象)中很常见,但也可以在这种情况下使用。
顺便说一句,你显然可以只是对有问题的UI控件进行子类化,并进一步将逻辑封装在那里。这同样有效。答案 1 :(得分:1)
通过为每个控制器创建引用插座,例如,如果您有两个UITableView,您可以为每个控制器创建插座,例如table1和table2。要为这些表设置节的行数,可以按照
进行编码-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == table1) {
return 10;
}
if (tableView == table2) {
return 5;
}
return 1;
}
答案 2 :(得分:0)
您可以为每个tableView或集合视图创建独立的UIViews,并使用它自己的.swift和.xib(如果它们非常相似,您可以重复使用它们)。这样做,您将在分离的文件中使用tableView和collecionView委托方法,一切都将更加清晰。在您的视图控制器中,您只需放置视图,但您不会在那里拥有任何委托方法。
答案 3 :(得分:0)
那么你要求用数据源和数据来区分视图。以更聪明的方式委派。但是你正在推翻这件事。
每个人都会采用不同的表格或选择器,因为它们不一样。 否则它们可以重复使用。
现在,如果它们与其他人不同,那么最终在代码中的某个地方你必须放置if ... else或case语句。例如,在设置UILabel的值或UITableViewCell中的任何值时进行tableview。
如果您遇到这样的问题,您必须在一个UIViewController
中放置那么多滚动视图或其他内容,那么如果您遵循编码标准或者可能是您的应用设计,那么这是不可能的情况是有缺陷的。