2017-06-23 2 views
1

Dies ist mein Code. Ich versuche einen Übergang zu machen. Ich habe ein Bar-Button-Element sowie eine Tabelle mit Zeilen, die den gleichen Abschnitt ausführen. Ich möchte wissen, wann die Schaltfläche angeklickt wird und wann eine bestimmte Zeile angezeigt wird.Swift Vorbereitung für Segue: Wie zu wissen, ob eine Taste oder eine Tabellenzeile initiiert Segue

Der folgende Code funktioniert für eine Schaltfläche, aber nicht für die Zeilen der Tabelle

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    activePlaceRow = indexPath.row 

    performSegue(withIdentifier: "toMap", sender: nil) 

} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "toMap" 
    { 
     let mapViewController = segue.destination as! ViewController 

     if let senderObject = sender 
     { 
      if (senderObject as! UIBarButtonItem).tag == 1 
      { 

       mapViewController.activePlaceRow = -2 
      } 
      else 
      { 
       mapViewController.activePlaceRow = activePlaceRow 
      } 
     } 

    } 
} 

Antwort

2

einfach den Indexpfad passieren, wie sender

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    performSegue(withIdentifier: "toMap", sender: indexPath) 

} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "toMap" 
    { 
     let mapViewController = segue.destination as! ViewController 

     if let buttonItem = sender as? UIBarButtonItem, buttomItem.tag == 1 { 
      mapViewController.activePlaceRow = -2 
     } 
     else if let indexPath = sender as? IndexPath { 
      mapViewController.activePlaceRow = indexPath.row 
     } 
    } 
} 
0

Was können Sie tun, ist eine Eigenschaft auf Ihre UIViewController

var isSegueFromCell:Bool = false

In Ihrem didSelectRowAt Methode hinzufügen Sie können diesen Wert als true zuweisen. Dann, wenn Ihr prepareForSegue Methode aufgerufen wird, überprüfen Sie:

if isSegueFromCell { 

    print("SEGUE FROM TABLE VIEW") 
} 
else { 
    print("SEGUE FROM BUTTON") 
} 

ODER

Wenn Sie anrufen performSegue Sie in einem Booltrue angibt, passieren kann, wenn von Ihrem didSelectRow Methode aufgerufen wird

performSegue(withIdentifier: "YourSegueID", sender: true) 

Dann erkennen Sie dies in Ihrer prepareForSegue Methode

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if let value = sender as? Bool { 
     if value { 
      print("FROM TABLE VIEW ROW") 
     } else { 
      print("FROM BUTTON") 
     } 
    } 
} 
0

Eine einfache Sache zu tun ist indexPathForSelectedRow oder indexPathsForSelectedRows zu überprüfen.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

if segue.identifier == "toMap" 
{ 
    let mapViewController = segue.destination as! ViewController 

    if let senderObject = sender 
    { 
     if (senderObject as! UIBarButtonItem).tag == 1 
     { 

      mapViewController.activePlaceRow = -2 
     } 
     else 
     { 
      mapViewController.activePlaceRow = tableView.indexPathForSelectedRow 
     } 
    } 

} 

Keine Notwendigkeit für die activePlaceRow auf diese Weise. Sie können auch einen Abschnitt im Storyboard erstellen, indem Sie mit der rechten Maustaste auf die Zelle klicken und auf den Ansichtscontroller ziehen. Anschließend können Sie die didSelectRow Implementierung löschen.