如何在视图控制器内部实现两个集合视图?

时间:2015-04-03 18:08:26

标签: iphone swift ios8 uicollectionview

您好我是Swift编程语言的初学者,我在视图控制器中实现两个集合视图时遇到问题,这是我希望实现的图片链接:

The picture I want to achieve

有可能吗?到目前为止,我有一些似乎不起作用的代码:

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

    }

}
}

1 个答案:

答案 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,这可能会使代码更难维护/读取。