2015-04-03 2 views
0

Привет Я новичок в 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 

    } 

} 
} 

ответ

0

Это очень возможно. Вы можете сделать это несколькими способами.

1:

Вы могли бы реализовать два содержащихся контроллера представления. Это может быть самым чистым, поскольку вы можете обрабатывать взаимодействие в отдельных контроллерах. В этом случае вам может потребоваться также реализовать некоторые делегаты/протоколы для передачи информации обратно в родительский контроль.

2:

Вы можете создать отдельный класс DataSource/делегата для обработки связанных с ними функций для каждого контроллера представления и назначать их в 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 свои объекты и назначьте источник данных в Tableview s:

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 и дифференцироваться между случаями путем сравнения коллекцияView передается в функции dataSource/Delegate на выход, подключенный к соответствующим элементам коллекции в представлении. Хотя этот случай не будет нуждаться в каких-либо делегированных делегатах, он заполнит viewController множеством утверждений if/else, возможно, сделать код более сложным для поддержания/чтения.

+0

Можете ли вы показать мне пример кода для номера 2? Должен ли я применять «registerClass (_ cellClass: AnyClass ?, forCellWithReuseIdentifier identifier: String)» на viewDidLoad для числа 2? @jbryson – GrumphyGuy

+0

Спасибо, это работает :) – GrumphyGuy

Смежные вопросы