wake-up-neo.com

Swift: Legt fest, dass der Button zur neuen Szene wechselt

In Ordnung, also habe ich eine TableView-Szene und ich werde in jede der Zellen einen Knopf einfügen, und ich brauche jede Zelle, um beim Anklicken segue zu ihrer eigenen ViewController-Szene zu gelangen. Mit anderen Worten, ich muss wissen, wie man einen Button mit einer Szene verbindet (der einzige Button, den ich momentan habe, ist "Milch"). 

Ich weiß, wie man eine mit einer Schaltfläche verknüpfte IBAction erstellt, aber was würde ich in die IBAction einfügen? 

Ich bin ein Anfänger, daher brauche ich hier eine Schritt-für-Schritt-Erklärung. Ich habe ein Bild von meinem Storyboard beigelegt. Ich habe noch keinen Code geschrieben. enter image description here

20
skyguy

Wenn Sie möchten, dass eine Schaltfläche den Segue-Übergang auslöst, ist Control + Click von der Schaltfläche zum View-Controller am einfachsten und wählen Sie eine Segue-Option (wie Push). Dies wird es in IB für Sie verdrahten.

Wenn Sie den Code schreiben möchten, um dies manuell zu tun, können Sie dies durch Benennen des Segues tun (es gibt eine Bezeichneroption, die Sie festlegen können, sobald Sie ihn erstellt haben. Sie müssen das Segment jedoch erst in IB erstellen, bevor Sie das tun können it) und dann können Sie es mit diesem Code auslösen:

V2

@IBAction func about(sender: AnyObject) {
    performSegueWithIdentifier("about", sender: sender)
}

V3

@IBAction func about(_ sender: Any) {
    performSegue(withIdentifier: "about", sender: sender)
}
30
AlBlue

Sie können das Delegierungsmuster verwenden. Wenn Sie davon ausgehen, dass Sie eine benutzerdefinierte Tabellenzelle implementiert haben, können Sie in ihrer Klasse eine Eigenschaft definieren, die das enthält, von dem Sie glauben, dass es hilfreich ist, um die Zeile zu identifizieren. Dies kann der Index sein oder (meine bevorzugte Methode) eine Instanz einer Klasse, die die Daten, die in der Zelle angezeigt werden (ich nenne es MyCellData).

Die Idee ist, die Zelle den Tabellensicht-Controller über ein Tippen auf diese Schaltfläche benachrichtigen zu lassen und relevante Daten (die angezeigten Daten) in der Zeile zu übergeben. Der Table View-Controller startet dann ein Segment und speichert in der überschriebenen prepareForSegue-Methode die von der Zelle an den Ziel-Controller übergebenen Daten. Auf diese Weise haben Sie, wenn Sie Detaildaten zur Zeile anzeigen müssen, alle relevanten Informationen, z. B. die Detaildaten selbst, oder eine Kennung, die der Ziel-View-Controller verwenden kann, um die Daten beispielsweise aus einer lokalen Datenbank oder einem Remote-Service abzurufen .

Definieren Sie ein Protokoll:

protocol MyCellDelegate {
    func didTapMilk(data: MyCellData)
}

dann deklarieren Sie eine Eigenschaft mit dem Namen delegate in der Zellklasse und rufen die didTapMilk-Methode von der IBAction auf

class MyTableCell : UITableViewCell {
    var delegate: MyCellDelegate?
    var data: MyCellData!

    @IBAction func didTapMilk() {
        if let delegate = self.delegate {
            delegate.didTapMilk(self.data)
        }
    }
}

Als Nächstes implementieren Sie das Protokoll in Ihrem Table View Controller zusammen mit einer Überschreibung von prepareForSegue.

extension MyTableViewController : MyCellDelegate {
    func didTapMilk(data: MyCellData) {
        performSegueWithIdentifier("mySegueId", sender: data)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if segue.identifier == "mySegueId" {
            let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController
            vc.data = sender as? MyCellData
        }
    }
}

Dazu benötigen Sie natürlich eine data -Eigenschaft auf Ihrem Ziel-View-Controller. Wie bereits erwähnt, können Sie, wenn Sie Details über die Zeile anzeigen, alle erforderlichen Daten in Ihre MyCellData-Klasse einbetten - oder zumindest das, was Sie zum Abrufen der Daten aus einer beliebigen Quelle benötigen (z. B. einer lokalen Datenbank, einem Remote-Service). usw.).

Speichern Sie zuletzt in cellForRowAtIndexPath die Daten in der Zelle und setzen Sie ihre delegate-Eigenschaft auf self:

extension MyTableViewController : UITableViewDataSource {
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell
        let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell
        cell.data = data
        cell.delegate = self

        // ... other initializations

        return cell
    }
}
15
Antonio

Verwenden Sie self.performSegueWithIdentifier("yourViewSegue", sender: sender) unter Ihrer Veranstaltung, um das Klicken der Schaltfläche zu handhaben:

@IBAction func redButtonClicked(sender: AnyObject) {
    self.performSegueWithIdentifier("redView", sender: sender)
}

Im obigen Code ist redView die Segmentkennung.

0
Aks