我有一些带有一些按钮的tableview。我希望当我点击其中一个导航到另一个控制器并使用segue发送一些值时。
我试过了:
cell.onSummaryTapped = {
self.servname = cell.service.text!
self.region = String(self.regions[indexPath.row])
self.contPer2 = String(self.contper[indexPath.row])
self.shift = String(self.shifttype[indexPath.row])
self.date = cell.date.text!
self.nationality = String(self.nationalities[indexPath.row])
self.price2 = cell.totalprice.text!
self.summary(servname: self.servname, region: self.region, contper: self.contPer2, shift: self.shift, date: self.date, nationality: self.nationality)
}
func summary(servname: String, region: String, contper: String, shift: String, date: String, nationality: String){
DispatchQueue.main.async {
self.performSegue(withIdentifier: "summary", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "summary"{
let sum = segue.destination as! ViewSummaryController
sum.servname = self.servname
print(servname)
sum.region = self.region
sum.contPer = self.contPer2
sum.shift = self.shift
sum.date = self.date
sum.nationality = self.nationality
sum.price = self.price2
}
}
但是值总是在设置之前发送。如何解决这个问题并在设置值后显示segue?
更新
cell.onSummaryTapped = {
let selectedData = ["servname":cell.service.text!,"region":String(self.regions[indexPath.row]),"contper":String(self.contper[indexPath.row]),"shift":String(self.shifttype[indexPath.row]),"date":cell.date.text!,"nationality":String(self.nationalities[indexPath.row]), "price":cell.totalprice.text! ] as [String : Any]
self.performSegue(withIdentifier: "summary", sender: selectedData)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Here check your targeted segue and get parameters from sender
if let identifier = segue.identifier , identifier == "summary" {
let nextScene = segue.destination as! ViewSummaryController
nextScene.selectedData = sender as? [String:Any] // sender paramters
}
}
和另一个控制器:
var selectedData : [String:Any]?
print("parameters are: ")
print(selectedData)
并且我仍然没有
parameters are:
nil
Optional(["region": "1", "servname": "Nadafa", "shift": "day", "date": "2018-05-06 ", "contper": "0", "price": "SAR 80", "nationality": "4"])
here:
Optional({
contper = 0;
date = "2018-05-06 ";
nationality = 4;
price = "SAR 80";
region = 1;
servname = Nadafa;
shift = day;
})
here2:
Optional(["region": "1", "servname": "Nadafa", "shift": "day", "date": "2018-05-06 ", "contper": "0", "price": "SAR 80", "nationality": "4"])
2018-05-06 21:37:25.692603+0300 SRACO[3317:1313360] <UIView: 0x102ceb3c0; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x108210fa0>>'s window is not equal to <SRACO.ViewSummaryController: 0x103880800>'s view's window!
Optional(["region": "1", "servname": "Nadafa", "shift": "day", "date": "2018-05-06 ", "contper": "0", "price": "SAR 80", "nationality": "4"])
答案 0 :(得分:0)
您应该从发件人
获取参数 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Here check your targeted segue and get parameters from sender
if let identifier = segue.identifier , identifier == "summary" {
let nextScene = segue.destination as! UIViewController
// nextScene.paramters = sender as? [String:Any] // sender paramters
}
}
// Here you perform segue with paramters
func summary(servname: String, region: String, contper: String, shift: String, date: String, nationality: String){
let paramters =["servname":servname,"region":region,"contper":contper,"shift":shift,"date":date,"nationality":nationality]
self.performSegue(withIdentifier: "summary", sender: paramters)
}
在目标视图控制器中获取参数
class ViewController: UIViewController{
var paramters : [String:Any]?
override func viewDidLoad() {
super.viewDidLoad()
let servname = paramters[servname]
let region = paramters[region]
let contper = paramters[contper]
let shift = paramters[shift]
let date = paramters[date]
let nationality = paramters[nationality]
}
}