Подготовьтесь к Segue в Swift
Я столкнулся с сообщением об ошибке:
"UIStoryboardSegue does not have a member named 'identifier'"
Здесь код, вызывающий ошибку
if (segue.identifier == "Load View") {
// pass data to next view
}
В Obj-C он отлично работает следующим образом:
if ([segue.identifier isEqualToString:@"Load View"]) {
// pass data to next view
}
Что я делаю неправильно?
Ответы
Ответ 1
Это связано с проблемой в шаблоне подкласса UITableViewController
. Он поставляется с версией метода prepareForSegue
, который потребовал бы, чтобы вы развернули segue.
Замените текущую функцию prepareForSegue
на:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "Load View") {
// pass data to next view
}
}
Эта версия неявно разворачивает параметры, поэтому вы должны быть в порядке.
Ответ 2
Свифт 4, Свифт 3
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MySegueId" {
if let nextViewController = segue.destination as? NextViewController {
nextViewController.valueOfxyz = "XYZ" //Or pass any values
nextViewController.valueOf123 = 123
}
}
}
Ответ 3
Я думаю, проблема в том, что вы должны использовать! разделить идентификатор
У меня
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if segue!.identifier == "Details" {
let viewController:ViewController = segue!.destinationViewController as ViewController
let indexPath = self.tableView.indexPathForSelectedRow()
viewController.pinCode = self.exams[indexPath.row]
}
}
Я понимаю, что без! вы просто получаете истинное или ложное значение
Ответ 4
Для Swift 2.3, swift3 и swift4:
Создайте перформанс Segue на didSelectRowAtindexPath
Например:
self.performSegue(withIdentifier: "uiView", sender: self)
После этого создайте функцию prepareforSegue, чтобы поймать переход Destination и передать значение:
Пример:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "uiView"{
let destView = segue.destination as! WebViewController
let indexpath = self.newsTableView.indexPathForSelectedRow
let indexurl = tableDatalist[(indexpath?.row)!].link
destView.UrlRec = indexurl
//let url =
}
}
Вам необходимо создать переменную с именем UrlRec в Destination ViewController
Ответ 5
Swift 1.2
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "ShowDeal") {
if let viewController: DealLandingViewController = segue.destinationViewController as? DealLandingViewController {
viewController.dealEntry = deal
}
}
}
Ответ 6
Подготовьтесь к Segue в Swift 4.2 и Swift 5.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "OrderVC") {
// pass data to next view
let viewController = segue.destination as? MyOrderDetailsVC
viewController!.OrderData = self.MyorderArray[selectedIndex]
}
}
Как вызывать переход на конкретное событие (например, нажатие кнопки и т.д.):
performSegue(withIdentifier: "OrderVC", sender: self)
Ответ 7
Это один из способов, которыми вы можете использовать эту функцию, это когда вы хотите получить доступ к переменной другого класса и изменить вывод на основе этой переменной.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let something = segue.destination as! someViewController
something.aVariable = anotherVariable
}
Ответ 8
При условии, что вы не используете один и тот же контроллер представления назначения с разными идентификаторами, код может быть более кратким, чем другие решения (и в некоторых других ответах не используется as!
):
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let myViewController = segue.destinationController as? MyViewController {
// Set up the VC
}
}
Ответ 9
Измените идентификатор segue на правой панели в разделе с идентификатором. значок, соответствующий строке, которую вы использовали в условном выражении.
Ответ 10
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if(segue!.identifier){
var name = segue!.identifier;
if (name.compare("Load View") == 0){
}
}
}
Вы не можете сравнить идентификатор с ==, вы должны использовать метод compare()