2015-06-11 3 views
27

У меня есть следующие функции OnClickОткрыть новый View Controller, нажав Cell в 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) 

} 

, которая печатает текст на ячейку, которая щелкнули. Он работает нормально.

Я просто интересно, как вы бы установить функцию, которая будет направлять вас на новый контроллер вида

ответ

49

: Программным способом

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

Раскадровка:
Сначала вы будете иметь для установки идентификатора для вашего представления. На скриншоте ниже вы можете увидеть, где ввести идентификатор.

screenshot

После этого, вы можете создать «пункт назначения» и подтолкнуть ее к навигации контроллера, используя код ниже:

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

Segue:
Сначала вы будете иметь для установки идентификатора для вашего сеанса, как показано ниже:

segue1

segue2

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

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

EDIT: Обновление для Swift 3.x

+0

Извинения за мою неопытность. Как указать, какой контроллер просмотра я назначаю константе 'destination'? –

+0

Создал ли контроллер представления в раскадровке или программно? – Eendje

+0

Просто используя раскадровку. Я очень новичок в этом и стараюсь держать его как можно проще. Спасибо за помощь. –

7

В раскадровке, установите storyboardId вашего ViewController в идентичности инспектора.

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

Использование необъявленного типа «SecondViewController», в чем причина этой ошибки? –

+0

замените SecondViewController на любой ваш viewController.your новый контроллер! –

+0

Я люблю storyboardID, он делает код читаемым. –

0

при использовании,

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

Значение выбранной строки перейти к другому контроллеру вид слишком поздно. Вы бы лучше передать выбранную строку в FUNC prepareForSegue, как показано ниже, сначала объявить глобальную переменную передать значение другой ViewController

var globalVar:Int 

В приложении раскадровки на основе, вы часто хотят, чтобы сделать немного подготовки перед навигацией

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

для других пользователей, зашедших на этот вопрос, если у вас есть статические клетки в UITableViewController, вы можете просто контролировать сопротивление от се ll к новому контроллеру View.

enter image description here

Вы также можете сделать это на динамических ячеек, если вам не нужно передавать какие-либо данные к следующему View Controller.Однако, если вам нужно передать данные, вы должны make the segue from the Table View's view controller itself and not the cell. Затем вызовите segue программно.

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

Просто перетаскивание из статической ячейки, похоже, не работает для меня. Я использую простой «Show» segue. Я также попытался указать его как «вспомогательное действие» («индикатор раскрытия информации» в моем случае), безрезультатно – Antek

+0

ОК, очевидно, трюк заключался в том, чтобы использовать контроллер навигации в качестве родителя для контроллера таблицы – Antek