Как вы передаете данные между диспетчерами вида в 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, и оно работает для меня.