2017-05-05 4 views
0

Ich möchte eine CollectionView Methoden aus einer anderen swift-Datei anstelle von ViewController aus irgendeinem Grund verwenden.Verwenden Sie CollectionView-Methoden aus einer anderen Swift-Datei

Ich habe dies in meinem ViewController:

@IBOutlet weak var collectionView: UICollectionView! 
var broadcastColletionView = BroadcastCollectionView() 

override func viewDidLoad() { 
super.viewDidLoad() 
broadcastColletionView = BroadcastCollectionView(eventItems: eventItems,collectionView: collectionView, broadastObject: broadastObject) 
collectionView.dataSource = broadcastColletionView 
collectionView.delegate = broadcastColletionView 
} 

Und ich habe BroadcastCollectionView.swift, die die Collection Delegatmethoden enthält:

class BroadcastCollectionView: NSObject,UICollectionViewDelegate, UICollectionViewDataSource { 

var eventItems = [Eventtype]() 
var alreadyChecked: Bool = false 
var cellHistory: IndexPath = [] 
var collectionView: UICollectionView! 
var broadastObject = Broadcast() 

init(eventItems: [Eventtype],collectionView: UICollectionView, 
broadastObject: Broadcast) { 
self.eventItems = eventItems 
self.collectionView = collectionView 
self.broadastObject = broadastObject 
} 
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return eventItems.count 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "brCollectionView", for: indexPath) as! BroadcastCollectionViewCell 

    self.collectionView = collectionView 

    cell.eventImage.image = eventItems[indexPath.row].image 
    cell.eventType = eventItems[indexPath.row] 
    let tap = UITapGestureRecognizer(target: self, action: #selector(collectionViewTapped)) 
    tap.numberOfTapsRequired = 1 

    cell.addGestureRecognizer(tap) 

    return cell 

} 

@objc func collectionViewTapped(sender: UITapGestureRecognizer) { 
    if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) { 

     let cell : BroadcastCollectionViewCell = collectionView.cellForItem(at: indexPath)! as! BroadcastCollectionViewCell 
     print("item index") 
    } else { 
     print("collection view was tapped") 
    } 
} 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    print("selected row is",indexPath.row) 
} 

Ich verstehe wirklich nicht, warum die Delegatmethoden nicht genannt wenn ich die collectionView.delegate und dataSource auf die Klasse BroadcastCollactionView gesetzt habe. Bitte lassen Sie mich nicht erklären, warum ich dieses CollectionView trennen möchte, es ist nicht Teil der Frage.

+0

Stellen Sie sicher, dass Outlets von collectionView korrekt verbunden sind und delegate und dataSource nicht vom Storyboard aus verknüpft sind. –

+0

Ja, ja, ich habe es bereits überprüft, und der Delegat und die Datenquelle sind nicht mit Anyith verbunden. Wenn ich es also in der 'viewDidLoad' Methode überschreibe, sollte es die geschriebene Klasse sein. –

+0

Können Sie nach dem Zuweisen von Datenquelle und Delegat ans collectionView überprüfen, was der Wert von collectionView.delegate und collectionView.dataSource ist. –

Antwort

0

Nach der Einstellung Datenquelle und Delegierter für die Sammlung Ansicht in viewDidLoad() -Methode, laden Sie die Sammlung Ansicht:

collectionView.reloadData() 
0

andere Diese Klasse, die Sie CustomDataSource genannt erstellt Ihnen ein Tutorial here

finden Versuchen Sie, collectionView.reloadData() nach dem Festlegen der DataSource und delegieren.

und sicherstellen, dass eventItems nicht leer ist.

Hoffe es hilft!

0

Abgesehen von der Frage der nicht in Ihrem Fall arbeitet, die nicht die Sammlung Ansicht richtig zu konfigurieren, die die Antworten gelöst werden können Sie von anderen Benutzern über bekam Verwendung zurückzuführen sein könnte,

Es für Ihre Frage "ist ein Ansatz Verwenden Sie CollectionView-Methoden aus einer anderen Swift-Datei " Sie können das Konzept" Erweiterung "verwenden, ich werde Ihnen erklären, wie.

  1. eine neue Klasse erstellen, die Sammlung Ansicht Methoden wie folgt
class MyDataSource: NSObject { 
    var eventItems: Array<Any>? 

    init(events: Array<Any>?) { 
     self.eventItems = events 
    } 
} 

extension MyDataSource: UITableViewDataSource, UITableViewDelegate { 

    // MARK: - Table view data source methods 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier") 

     return cell 
    } 

    // Add additional data source methods & delegate methods as per your need 

    // MARK: - Table view delegate methods 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     // Perform your action 
     // Use delegate methods(protocols) to do your actions from the viewController class 
    } 

} 
  • Und in der Viewcontroller Datei assign
      für den Umgang mit die Datenquelle & Delegate-Methode für die Auflistung wie folgt anzeigen,

    Klasse ViewController: UIViewController { var Datenquelle: MyDataSource?

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        // Initialize datasource & delegate for collectionView with the extension datasource 
        datasource = MyDataSource(events: EVENTITEMS_ARRAY) 
        collectionView?.dataSource = datasource 
        collectionView?.delegate = datasource 
        } 
    } 
    

    HINWEIS

    1. Aktualisieren Sie die Datentypen & Sammlung Ansicht Eigenschaften wie Zellkennung nach Ihrem Bedarf.
  • Verwandte Themen