Как вы передаете данные между диспетчерами вида в Swift?

Я попытался создать глобальные переменные и обновить информацию при загрузке представления, но данные не отображаются.

ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

var viewName:String = ""
var viewDuration:String = ""
var viewPeriod:String = ""
var viewMinAmp:String = ""
var viewMaxAmp:String = ""
var viewStep:String = ""
var viewType:String = ""

Существует ли более эффективный способ передачи информации, отличной от глобальных переменных?

@IBOutlet var txtName: UITextField!
@IBOutlet var txtDuration: UITextField!
@IBOutlet var txtPeriod: UITextField!
@IBOutlet var txtMinAmp: UITextField!
@IBOutlet var txtMaxAmp: UITextField!
@IBOutlet var txtStep: UITextField!
@IBOutlet var txtType: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    setInfo(viewName, duration: viewDuration, period: viewPeriod, minAmp: viewMinAmp, maxAmp: viewMaxAmp, step: viewStep, type: viewType)
}

func setInfo(name: String, duration: String, period: String, minAmp: String, maxAmp: String, step: String, type: String) {
    txtName.text = name
    txtDuration.text = duration
    txtPeriod.text = period
    txtMinAmp.text = minAmp
    txtMaxAmp.text = maxAmp
    txtStep.text = step
    txtType.text = type
}

Ответы

Ответ 1

Одним из решений было бы переопределить prepareForSegue (segue: sender:) изнутри контроллера представления, который содержит данные, которые вы хотите передать контроллеру вида назначения.

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "YourSegueName") {
        //get a reference to the destination view controller
        let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass

        //set properties on the destination view controller
        destinationVC.name = viewName
        //etc...
    }
}

Ответ 2

Для Swift 3.0

final class Shared {
     static let shared = Shared() //lazy init, and it only runs once

     var stringValue : String!
     var boolValue   : Bool!
}

Чтобы установить stringValue

Shared.shared.stringValue = "Hi there"

чтобы получить stringValue

 if let value = Shared.shared.stringValue {
        print(value)
 }

Для версии Swift ниже 3.0

Вы можете передавать данные между представлениями, используя singleton class. Это легко и эффективно. Вот мой класс ShareData.swift

import Foundation

class ShareData {
    class var sharedInstance: ShareData {
        struct Static {
            static var instance: ShareData?
            static var token: dispatch_once_t = 0
        }

        dispatch_once(&Static.token) {
            Static.instance = ShareData()
        }

        return Static.instance!
    }


    var someString : String! //Some String

    var selectedTheme : AnyObject! //Some Object

    var someBoolValue : Bool!
}

Теперь в моем ViewControllerOne я могу установить выше переменную.

//Declare Class Variable

let shareData = ShareData.sharedInstance

override func viewDidLoad() {
    self.shareData.someString ="Some String Value"
}

И в моем ViewControllerTwo я могу получить доступ к someString как

let shareData = ShareData.sharedInstance
override func viewDidLoad() {
    NSLog(self.sharedData.someString) // It will print Some String Value
}

Ответ 3

Лично я предпочитаю следующие способы:

  • Если вы хотите перейти вперед между двумя контроллерами представлений (от A до B), как -pushViewController: анимированный: в навигации вы можете определить свойство модели для контроллера B и публиковать его публично, а затем установить это свойство явно перед прыжком с контроллера A, это довольно просто:

  • Если вы хотите перейти от контроллера B к A, используйте режим Delegate + Protocol. Контроллер B создает публичный протокол и владеет свойством "делегировать", любой объект, который хотел бы быть делегатом Контролера B, должен выполнять и реализовывать свой протокол (необязательно). то перед переходом назад контроллер B делает свой делегат выполненным определенным действием (действиями), указанными в протоколе, данные могут быть переданы таким образом;

  • При определенных обстоятельствах вы можете перенести данные с контроллера (или контроллеров) на другие несколько контроллеров, использовать механизм уведомления, если это так.

В Apple есть подробные инструкции о режиме делегата, режиме уведомления в официальной документации, проверьте их в XCode,:)

Ответ 4

Просто нужно выполнить 3 шага, предположим, что вы хотите передать данные из ViewControllerA в ViewControllerB:

  • создать сеанс между ViewControllerA и ViewControllerB
  • назовите segue с идентификатором в его инспекторе атрибутов
  • переопределить prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) в ViewControllerA

Для шага №3:

  • если вы не используете swift 2.1, пожалуйста, следуйте @Scott Mielcarski ответ на этот вопрос
  • для людей, которые используют swift 2.1, или кто получает ошибку "Невозможно преобразовать значение типа 'UIViewController' в указанный тип 'ваше представление Имя класса контроллера 'После того, как @Scott Mielcarski ответит на этот вопрос, Пожалуйста, используйте: let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass вместо let destinationVC:ViewControllerClass = segue.destinationViewController

    Это проверено на Swift 2.1.1, и оно работает для меня.