您好我是Swift编程语言的初学者,我在视图控制器中实现两个集合视图时遇到问题,这是我希望实现的图片链接:
有可能吗?到目前为止,我有一些似乎不起作用的代码:
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDataSource, UICollectionViewDelegate{
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var collectionViewTwo: UICollectionView!
var optionOne = ["Gulsah", "Hurrem", "Mihrimah", "Nilufer"]
override func viewDidLoad() {
super.viewDidLoad()
self.resetFilterThumbnails()
self.collectionView.delegate = self
}
//For the collectionView, number of filters in the section
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if (filters == true){
//do all the stuff here for FILTER_CELL
return self.filters.count}
else{
return self.optionOne.count}
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("FILTER_CELL", forIndexPath: indexPath) as FilterThumbnailCell
let cellTwo = collectionView.dequeueReusableCellWithReuseIdentifier("FILTER_CELL_TWO", forIndexPath: indexPath) as FilterThumbnailCell
var filterThumbnail = self.filterThumbnails[indexPath.row]
println("filter cell two")
if (indexPath.item == 0){
//do all the stuff here for FILTER_CELL
if filterThumbnail.filteredThumbnail != nil {
cell.imageView.image = filterThumbnail.filteredThumbnail
} else {
cell.imageView.image = filterThumbnail.originalThumbnail
//filterThumbnail is a class instance
filterThumbnail.generateThumbnail({ (image) -> Void in
if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? FilterThumbnailCell {
cell.imageView.image = image
}
})
}
return cell
}else{
//FILTER_CELL_TWO
var button = cellTwo.viewWithTag(1) as UILabel
button.text = optionOne[indexPath.row]
cellTwo.backgroundColor = UIColor.redColor()
return cellTwo
}
}
}
答案 0 :(得分:0)
这很可能。你可以用几种方式做到这一点。
<强> 1 强>
您可以实现两个包含的视图控制器。这可能是最干净的,因为您可以在单独的控制器中处理交互。在这种情况下,您可能还需要实现一些委托/协议以将信息传递回parentViewController。
<强> 2 强>
您可以创建一个单独的数据源/委托类来处理每个视图控制器的关联函数,并在viewDidLoad中分配它们。这种情况可能还需要实现委托/协议来传递来自collectionView dataSource / Delegate类的信息。
以下是一个示例,取自Master-Detail起始类。像这样创建您的类(如果需要,添加符合UITableViewDelegate):
import UIKit
class MyDataSource: NSObject, UITableViewDataSource {
var objects = [AnyObject]()
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
let object = objects[indexPath.row] as NSDate
cell.textLabel!.text = object.description
return cell
}
}
然后在你的UIViewController中创建一个MyDataSource类型的变量:
var dataSource1 = MyDataSource()
var dataSource2 = MyDataSource()
在viewDidLoad中,您可以为dataSource分配其对象,并将数据源分配给tableviews:
dataSource1.objects = objects1;
dataSource2.objects = objects2;
tableView1.dataSource = dataSource1
tableView2.dataSource = dataSource2
现在,每个tableviews都将使用此DataSource的不同实例,以及自己的一组模型对象。如果您需要进一步自定义数据源(就像您所做的那样)只需创建另一个数据源类并将其分配给相应的对象。如果您符合这些数据源对象中tableview的委托,则应该为数据源实现标准协议,并在视图控制器内符合该协议:
数据源对象上方:
protocol DataSourceDelegate{
func didSelectCellAtIndexPath(indexPath:NSIndexPath)
}
数据源对象内部:
var dataSourceDelegate:DataSourceDelegate?
视图控制器内部:
dataSource.dataSourceDelegate = self
确保符合类定义中的委托。然后在视图控制器中实例化该方法:
func didSelectCellAtIndexPath(indexPath:NSIndexPath){
// Your code here
}
确保在数据源
中调用委托func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
dataSourceDelegate?.didSelectCellAtIndexPath(indexPath)
}
要注册单元格,如果您使用的是故事板,只需确保单元格标识符是正确的,并且您不需要注册任何其他内容。如果没有,你可以在dataSource中注册单元格(可能是一个好主意,因为它会保留所有信息)
第3:强>
您可以使用一个viewController,并通过将传递给dataSource / Delegate函数的collectionView与连接到视图中相应collectionViews的插座进行比较来区分这些情况。虽然这种情况不需要实现任何委托,但它会使用很多if / else语句填充viewController,这可能会使代码更难维护/读取。