2016-10-29 3 views
0

Hier Aufruf ist der Code mit dem Delegierten Prozess ... vorgeschlageneine Funktion in einem View-Controller von einem anderen View-Controller

in Hauptansicht Controller ...

protocol FilterDelegate: class { 
    func onRedFilter() 
    func onGreenFilter() 
    func onBlueFilter() 
    func onUnfiltered() 
} 

class ViewController: UIViewController, FilterDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

---- 

// Increase red color level on image by one. 
    func onRedFilter() { 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "filterSegue" { 

      let dest = segue.destinationViewController as! CollectionViewController 
      dest.filterDelegate = self 

     } 
    } 

in Controller Sammlung Ansicht ..

.
var filterDelegate: FilterDelegate? 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

    print("Cell \(indexPath.row) selected") 

    guard let filterDelegate = filterDelegate else { 
     print("Filter delegate wasn't set!") 
     return 
     } 

    switch indexPath.row { 

     case 0: 
      filterDelegate.onRedFilter() 
     case 1: 
      filterDelegate.onGreenFilter() 
     case 2: 
      filterDelegate.onBlueFilter() 
     case 3: 
      filterDelegate.onUnfiltered() 
     default: 
      print("No available filter.") 

    } 

Gerade jetzt ... stoppt der Code am Schutzblock und gibt die Fehlermeldung aus. Der Schalterblock wird bei einem Drücken einer Zelle nicht ausgeführt.

Antwort

0

Ihre Theorie in Ihrem vorletzten Satz ist richtig - wenn Sie storyboard.instantiateViewControllerWithIdentifier in der "Kind" Ansicht Controller aufrufen, erstellen Sie tatsächlich eine völlig neue Instanz Ihrer Hauptansicht Controller. Sie sind nicht bekommen einen Verweis auf den vorhandenen Hauptansicht Controller, weshalb die Methoden, die Sie anrufen, keine Wirkung haben.

Es gibt mehrere Möglichkeiten zu erreichen, was Sie versuchen, einschließlich der delegate pattern oder die Verwendung von Verschlüsse. Hier ist eine Skizze, wie es unter Verwendung eines Delegaten Protokoll aussehen könnte:

protocol FilterDelegate: class { 
    func onRedFilter() 
    func onGreenFilter() 
    func onBlueFilter() 
    func onUnfiltered() 
} 

class MainViewController: UIViewController, FilterDelegate { 

    // implement these as required 
    func onRedFilter() { } 
    func onGreenFilter() { } 
    func onBlueFilter() { } 
    func onUnfiltered() { } 

    // when we segue to the child view controller, we need to give it a reference 
    // to the *existing* main view controller 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let dest = segue.destination as? ChildViewController { 
      dest.filterDelegate = self 
     } 
    } 

} 

class ChildViewController: UIViewController { 

    var filterDelegate: FilterDelegate? 

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

     // ... 

     guard let filterDelegate = filterDelegate else { 
      print("Filter delegate wasn't set!") 
      return 
     } 

     switch indexPath.row { 
      case 0: 
       filterDelegate.onRedFilter() 
      case 1: 
       filterDelegate.onGreenFilter() 
      case 2: 
       filterDelegate.onBlueFilter() 
      case 3: 
       filterDelegate.onUnfiltered() 
      default: 
       print("No available filter.") 

     } 

    } 

} 

Eine weitere Option Verschlüsse wäre bieten auf ChildViewController für jede Funktion auf MainViewController, dass das Kind aufrufen muss, und legen Sie sie in prepareForSegue. Die Verwendung eines Delegaten scheint jedoch etwas sauberer zu sein, da es in diesem Fall eine Reihe von Funktionen gibt.

+0

Ich habe dies versucht und nicht nur die Zellen nicht die Filter aufrufen (nicht einmal die eingebetteten print-Anweisungen, die die indexPath.row, die funktionierte), aber jetzt das horizontale Scrollen der Collectionviewcontroller ist gebrochen. Irgendwelche Ideen? –

+0

Es hört sich an, als ob etwas mit dem Child-View-Controller durcheinander gelaufen ist und die UICollectionViewDataSource-Methoden nicht funktionieren. Ohne den Code zu sehen, ist es schwer zu sagen, was vor sich geht. Ich denke, ich würde sicherstellen, dass UICollectionViewController (nicht UIViewController) immer noch unterklassifiziert wird, und stelle sicher, dass die Datenquelle immer noch korrekt im Storyboard eingebunden ist. –

+0

Nun, ich habe es geschafft, es zurück zu bekommen, so dass die scrollende Sammlungsansicht funktioniert. Kannst du mir erklären, was der Block mit der Wache macht und ob etwas fehlt? Momentan ist das Drucken des "Filterdelegaten nicht eingestellt!" Anweisung für jede Zelle drücken auf dem Scroll-Menü und zurück, nie zur switch-Anweisung zu bekommen. –

Verwandte Themen