2015-06-11 9 views
27

Mam następującą funkcję onClickOtwórz nowy View Controller klikając komórka w Table View - Swift iOS

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    let row = indexPath.row 
    println("Row: \(row)") 

    println(meetingArray[row] as! String) 

} 

który wypisuje tekst na komórki, która jest kliknięty. Działa dobrze.

Zastanawiam się w jaki sposób można ustawić funkcję które skierują Cię do nowego kontrolera widoku

Odpowiedz

49

programowo:

let destination = UIViewController() // Your destination 
navigationController?.pushViewController(destination, animated: true) 

Storyboard:
Najpierw musisz ustawić identyfikator dla twojego widoku. Na poniższym zrzucie ekranu możesz zobaczyć, gdzie wpisać identyfikator.

screenshot

Po tym, można stworzyć "cel" i przesunąć go do kontrolera nawigacji za pomocą poniższego kodu:

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) 
let destination = storyboard.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController 
navigationController?.pushViewController(destination, animated: true) 

Segue:
Najpierw będziesz musiał aby ustawić identyfikator dla Twojego segue, jak pokazano poniżej:

segue1

segue2

performSegue(withIdentifier: "segue", sender: self) 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "segue" { 
     // Setup new view controller 
    } 
} 

EDIT: Aktualizacja dla Swift 3.x

+0

Przepraszam za niedoświadczenie. Jak określić, który kontroler widoku przyporządkuję do stałej "docelowej"? –

+0

Czy utworzono kontroler widoku w programie storyboard lub programowo? – Eendje

+0

Wystarczy użyć scenorysu. Jestem bardzo nowy i staram się, aby było to tak proste, jak to tylko możliwe. Dzięki za pomoc. –

7

W serii ujęć, ustaw storyboardId Twojego viewController w Identity Inspector.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

tableView.deselectRowAtIndexPath(indexPath, animated: true) 

let row = indexPath.row 
println("Row: \(row)") 

println(meetingArray[row] as! String) 

let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("storyBoardIdFor your new ViewController") as SecondViewController 

self.navigationController.pushViewController(secondViewController, animated: true) 

} 
+0

Użycie niezadeklarowanego typu "SecondViewController", jaki byłby powód tego błędu? –

+0

zamień SecondViewController z dowolnym kontrolerem viewController.your! –

+0

Uwielbiam storyboardID, sprawia, że ​​kod jest czytelny. –

0

jeśli stosując

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

Wartość wybranego szeregu przejść do innego sterownika widok zbyt późno. Lepiej zdać wybrany wiersz w func prepareForSegue jak poniżej, początkowo zadeklarować zmienną globalną przekazać wartości do drugiej viewController

var globalVar:Int 

W aplikacji opartych na serii ujęć, ty często chcą zrobić trochę przygotowania przed nawigacji

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
     let selectedIndex = self.tableView.indexPathForCell(sender as! UITableViewCell) 
     globalVar = selectedIndex!.row 
     print("tableView prepareForSegue: " + String(globalVar)) 

    } 
1

dla innych użytkowników przybywających do tego pytania, jeśli masz statyczne komórek w UITableViewController, można po prostu kontrolować przeciągnij z CE ll do nowego kontrolera widoku.

enter image description here

Można to zrobić również na komórkach dynamicznych, jeśli nie trzeba podawać żadnych danych do następnego widoku kontrolera.Jeśli jednak musisz przekazać dane, powinieneś uzyskać make the segue from the Table View's view controller itself and not the cell. Następnie wywołaj programowo dyskretnie.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    self.performSegue(withIdentifier: "mySegueIdentifier", sender: self) 
} 
+0

po prostu przeciąganie ze statycznej komórki nie działa dla mnie. Używam prostej "Pokaż". Próbowałem również określić go jako "akcję dodatkową" ("wskaźnik ujawnienia" w moim przypadku), bezskutecznie. – Antek

+0

ok, najwyraźniej sztuczka polegała na użyciu kontrolera nawigacyjnego jako nadrzędnego dla kontrolera tabel – Antek