2017-06-04 5 views
1

Ich habe Tabelle View-Controller, sollte als Einstellungsseite dienen, die eine UISegmentedControl mit 3 Segmenten enthalten:Zugriff auf UISegmentedControl @IBOoutlet von einer anderen Klasse

class SettingsView: UITableViewController { 

@IBOutlet weak var ButtonSelection: UISegmentedControl! 

//Index 0 is default selection (first) 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // some code 
} 

Getrennt, ich habe einen Navigation-View-Controller, die 3 steuert verschiedene UIViewControllers mit entsprechenden Storyboard-IDs ("first", "second" und "third").

Ich versuche, den Navigation View Controller so vorzubereiten, dass er den passenden View Controller basierend auf UISegmentedControl-Auswahl präsentiert. Allerdings bekomme ich immer wieder "fataler Fehler: unerwarteterweise wurde nil beim Entpacken eines optionalen Werts gefunden" und bin nicht sicher, wie das Problem gelöst werden soll.

Dies ist, was ich versucht habe:

class NavViewController: UINavigationController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if SettingsView().ButtonSelection.selectedSegmentIndex == 0 { 

     print ("first segment is selected") 

     let destinationController = storyboard?.instantiateViewController(withIdentifier: "first") 

    else if SettingsView().ButtonSelection.selectedSegmentIndex == 1 { 

     print ("second segment is selected") 

     let destinationController = storyboard?.instantiateViewController(withIdentifier: "second") 

    else if SettingsView().ButtonSelection.selectedSegmentIndex == 0 { 

     print ("third segment is selected") 

     let destinationController = storyboard?.instantiateViewController(withIdentifier: "third") 

Könnte jemand mich in die richtige Richtung zeigen, bitte? Danke im Voraus!

Antwort

0

Sie haben ein paar Probleme.

Problem 1: Ein UITableViewController ist nicht eingerichtet, um etwas zu hosten aber eine Tabellenansicht. Die Inhaltsansicht ist als Tabellenansicht gesperrt. Wenn Sie eine Tabellenansicht wünschen, die von einer UITableViewController verwaltet wird, und Sie möchten anderen Inhalt im View-Controller, müssen Sie die UITableViewController ein Kind eines anderen View-Controllers machen. Die gute Nachricht ist, dass dies mit einer Containeransicht und einem Embed-Segue trivial ist.

Problem 2 ist ein "do not do" -Problem. Sie sollten die Ansichten eines View-Controllers als privat behandeln. Ein anderer Ansichtscontroller sollte nicht versuchen, das segmentierte Steuerelement eines anderen Ansichtscontrollers zu betrachten oder zu ändern. (Es ist ein schlechtes Design, und es kann auch zu Abstürzen wie dem beschriebenen führen, da Sie nicht sicher sein können, ob die Ansichten des anderen View-Controllers bereits geladen wurden.) Stattdessen sollten Sie der Ansicht eine Integer-Eigenschaft "selectedIndex" hinzufügen Controller, der das segmentierte Steuerelement enthält und das zum Lesen/Schreiben des ausgewählten Segments verwendet. (In OOP-Bedingungen fügen Sie eine öffentliche Schnittstelle zum "Vertrag" Ihres View-Controllers hinzu, die die Features freigibt, die Sie anzeigen möchten, und fügen dann Code hinzu, der diese Schnittstelle bereitstellt.)

Verwandte Themen