2016-04-29 14 views
3

Ich habe mehr TableViewController Klassen implementiert, die von einem Basis TableViewController Klassen wie folgt erben:calling Protokoll-Methode, die von der Unterklasse von der Super

class BasicTableViewController: UITableViewController { 
} 

class SpecificTableViewController: BasicTableViewController { 
} 

class AnotherSpecificTableViewController: BasicTableViewController { 
} 

dann ich ein sehr einfaches Protokoll erstellt erfrischende Möglichkeiten des spezifischen hinzufügen Viewcontroller Klassen wie folgt aus:

@objc 
protocol Refreshable { 
    func refresh() 
} 

meine spezifischen Viewcontroller Klassen das Protokoll wie folgt implementieren:

Die Frage ist jetzt: Was ist die richtige Methode, um die Refresh-Methode von BasicTableViewController aufzurufen, die selbst nicht dem Protokoll Refreshable entspricht? Im Moment habe ich so etwas wie dies tue (ohne sicher zu sein, ob es der richtige Weg ist):

class BasicTableViewController: UITableViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let _ = self as? Refreshable { 
      let refreshControl = UIRefreshControl() 
      refreshControl.addTarget(self, action: #selector(Refreshable.refresh), forControlEvents: .ValueChanged) 
      self.refreshControl = refreshControl 
     } 
    } 
} 

ganz am Anfang habe ich nicht das Protokoll mit @objc markieren und versucht, die Wähler so zu bauen: #selector(refresh). das hat aber nicht funktioniert. hoffe auf eine Klärung. :)

danke im voraus!

+0

Warum gehst du nicht lassen wollen 'BasicTableViewController' entsprechen' Refreshable'-Protokoll? – luiyezheng

+0

Werfen Sie einen Blick auf meinen Kommentar zu ** riik ** s Lösung. ich möchte nur eine refreshcontrol implementieren, wenn ein viewcontroller das 'Refreshable' Protokoll annimmt. Wenn Sie eine bessere Möglichkeit haben, diesen Check durchzuführen, können Sie ihn gerne präsentieren. :) das ist, was ich gefragt habe ... –

Antwort

1

Ich würde lassen die Superclass das Refreshable Protokoll implementieren

protocol Refreshable { 
    func refresh() 
    func shouldBeRefreshable() -> Bool 
} 

//Making the protocol methods optional 
extension Refreshable { 
    func refresh() {} 
    func shouldBeRefreshable() -> Bool { return false} 
} 

class SuperView: Refreshable { 
    func addRefreshControl() { 
     if shouldBeRefreshable() { 
      //Add Refresh Control 
     }else { 
      // Do Nothing 
     } 
    } 

    func shouldBeRefreshable() -> Bool { 
     //default 
     return false 
    } 
} 

//Refreshable Class 
class ChildA: SuperView { 
    func refresh() { 
     print("Refresh in Child A") 
    } 
    override func shouldBeRefreshable() -> Bool { 
     return true 
    } 
} 

//Not Refreshable Class 
class ChildB: SuperView { 
} 
+0

das Problem in diesem Fall ist, dass mein Einchecken 'viewDidLoad' nicht funktioniert, die ich nur ein' refreshControl' hinzufügen muss, wenn der Viewcontroller das 'Refreshable' Protokoll implementiert. –

+0

Nur die Antwort aktualisiert. Hoffe das hilft. – riik

+0

das könnte funktionieren, obwohl ich die 'shouldBeRefreshable' Methode als optional markieren würde, da ich es nicht in allen Subviewcontrollern implementieren möchte, die keine Auffrischungsfunktionen haben ... –

Verwandte Themen