1

Ich versuche, meine UITableView basierend auf der selectedSegmentIndex eines UISegmentedControl in meinem UITableView-Header zu steuern. Im Wesentlichen möchte ich, dass UISegmentedControl wie Twitter 'ich' Tab funktioniert. Ich habe die UISegmentedControl in einem UITableView Header und es wird mit dieser Methode aus der Warteschlange entfernt:Erkennen von Änderungen in UISegmentedControl in UITableView HeaderView

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "sectionDetailsHeaderView") as! SectionDetailsHeaderTableViewCell 
    return cell 
} 

Ich habe einen Auslass für die UISegmentedControl zu SectionDetailsHeaderTableViewCell angeschlossen, aber ich kann nicht herausfinden, wie eine Änderung der UISegmentedControl erkennen . Ich möchte eine Variable, var segmentedControlValue = Int() an die selectedSegmentIndex jedes Mal, wenn der Wert ändert und eine Funktion, func chooseDataToDisplay() {}, wenn der Wert ändert. Wie gehe ich dabei vor?

+0

Ohne mehr Code zu sehen, hat Ihr Modell möglicherweise bereits das ausgewählte Segment erkannt, aber das Ansichtsende von MVC muss entsprechend aktualisiert werden. Ich ringe jetzt mit genau diesem Ding. – aremvee

+0

Überprüfen Sie meine Antwort unten! –

Antwort

2

Mit Hilfe @Schomes Antwort und this post, ich war in der Lage, es herauszufinden!

1) Fügen Sie die UISegmentedControl in eine eigene UITableViewCell hinzu. Ich würde empfehlen, einen UIView mit einem weißen Hintergrund hinter dem UISegmentedControl, der die gesamte UITableViewCell abdeckt, so dass die TableView-Zellen hinter dem UISegmentedControl fließen.

2) Fügen Sie Ihre individuelle Zellklasse und Haken es bis zum UITableViewCell

3) In einen Auslass, wie yourSegmentedControl zu Ihrer benutzerdefinierten UITableViewCell Klasse. Fügen Sie KEINE Aktion in die benutzerdefinierte UITableViewCell Klasse hinzu. Dies wird in Schritt 4 programmgesteuert vorgenommen.

4) Fügen Sie in der Klasse UIViewController oder UITableViewController den folgenden Code hinzu.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let header = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! yourCustomCellClass 
    header.yourSegmentedControl.selectedSegmentIndex = self.segmentedControlValue 
    header.yourSegmentedControl.addTarget(self, action: #selector(self.getSegmentValue(sender:)), for: .valueChanged) 
    return header 
} 

self.segmentedControlValue sollte als var segmentedControlValue = Int() an der Spitze Ihrer ViewController Klasse deklariert werden. self.getSegmentValue(sender:) sollte erklärt werden, wie:

func getSegmentValue(sender: UISegmentedControl) { 
    self.segmentedControlValue = sender.selectedSegmentIndex 
} 

5) Sie müssen auch hinzufügen:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 45 
} 

Dies ist die Höhe des Headers ist. In meinem Fall ist die Größe 45

6) Sie können jetzt auf self.segmentedControlValue überall in Ihrem ViewController zugreifen. Es wird aktualisiert, wenn der Benutzer auf ein anderes Segment klickt.

1
segmentedControl.addTarget(self, action: "chooseDataToDisplay:", forControlEvents: .ValueChanged) 

Wo segmentedControl ist Ihre UISegmentedControl. Dies ruft func chooseDataToDisplay(segment: UISegmentedControl) {} jedes Mal auf, wenn sich der Wert ändert.

Referenzen:

https://developer.apple.com/reference/uikit/uisegmentedcontrol

Der Abschnitt Verhalten von Segmented Steuert https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/UISegmentedControl.html#//apple_ref/doc/uid/TP40012857-UISegmentedControl

+0

Dies scheint nicht zu funktionieren. Das ausgewählte Segment wird nie hervorgehoben und der Wert ändert sich nie. Ich schaute auf: http://stackoverflow.com/questions/30545198/swift-handle-action-on-segmentierte-control, aber es half auch nicht. –

+1

Vielleicht auf diese Antworten sehen http://stackoverflow.com/questions/18588941/uisegmentedcontrol-not-updating-view http://stackoverflow.com/questions/2718956/problem-in-inserting-segmented-control -to-header-view – Schomes

+0

Super! Diese Antwort und eine der Antworten in deinem Kommentar haben geholfen! Ich werde die Antwort posten, die für mich funktioniert hat. –

Verwandte Themen