Prepare-se para Segue em Swift
-
21-12-2019 - |
Pergunta
Estou enfrentando a mensagem de erro:
"UIStoryboardSegue does not have a member named 'identifier'"
Aqui está o código que causa o erro
if (segue.identifier == "Load View") {
// pass data to next view
}
No Obj-C tudo bem usar assim:
if ([segue.identifier isEqualToString:@"Load View"]) {
// pass data to next view
}
O que estou fazendo de errado?
Solução
Isto parece ser devido a um problema no UITableViewController
modelo de subclasse.Ele vem com uma versão do prepareForSegue
método que exigiria que você desembrulhasse o segue.
Substitua seu atual prepareForSegue
funcionar com:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "Load View") {
// pass data to next view
}
}
Esta versão desembrulha implicitamente os parâmetros, então você deve ficar bem.
Outras dicas
Rápido 4, Rápido 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
}
}
}
Acho que o problema é que você tem que usar o !desagregar identificador
Eu tenho
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]
}
}
Meu entendimento é que sem o !você apenas obtém um valor verdadeiro ou falso
Para Swift 2.3, Swift3 e Swift4:
Crie um Segue de execução em didSelectRowAtindexPath
Por exemplo:
self.performSegue(withIdentifier: "uiView", sender: self)
Depois disso, crie uma função prepareforSegue para capturar o Destination segue e passar o valor:
Ex:
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 =
}
}
Você precisa criar uma variável chamada UrlRec no Destination ViewController
Rápido 1.2
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "ShowDeal") {
if let viewController: DealLandingViewController = segue.destinationViewController as? DealLandingViewController {
viewController.dealEntry = deal
}
}
}
Prepare-se para Segue no Swift 4.2 e 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]
}
}
Como chamar segue em um evento específico (como clique no botão, etc.):
performSegue(withIdentifier: "OrderVC", sender: self)
esta é uma das maneiras de usar esta função, é quando você deseja acessar uma variável de outra classe e alterar a saída com base nessa variável.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let something = segue.destination as! someViewController
something.aVariable = anotherVariable
}
Desde que você não esteja usando o mesmo controlador de visualização de destino com identificadores diferentes, o código pode ser mais conciso que as outras soluções (e evita o as!
em algumas das outras respostas):
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let myViewController = segue.destinationController as? MyViewController {
// Set up the VC
}
}
Altere o identificador segue no painel direito da seção com um id.ícone para corresponder à string que você usou em sua condicional.
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if(segue!.identifier){
var name = segue!.identifier;
if (name.compare("Load View") == 0){
}
}
}
Você não pode comparar o identificador com == você tem que usar o método compare()