【发布时间】:2017-05-18 20:36:21
【问题描述】:
我有一个 swift 应用程序,它在一个视图控制器上抓取一些 gps 数据,然后将这些数据传递给另一个视图控制器。
我目前的方法涉及一个按钮,用户将在其中输入一些数据,点击此按钮,然后该按钮应执行两个操作,计算 gps 路线,并执行到下一个视图控制器的 segue。
但是,在转到下一个屏幕之前,我似乎无法让 segue 等待我的计算完成。如果我登陆第二个视图然后按返回,然后再次按下按钮,数据将显示在第二个屏幕上,但我似乎无法立即使其工作。
我关注了这个问题:Separate Button action and segue action 仍然遇到问题
我完全是个菜鸟,所以如果这个问题是微不足道的,我深表歉意
FirstViewController.swift:
....
@IBOutlet weak var calculateButton: UIButton!
var routeArray = Array<Array<MKRoute>>()
var distanceArray: [CLLocationDistance] = []
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segue_to_table"{
if let destination = segue.destination as? SecondTableViewController{
destination.routeArray = self.routeArray
destination.distanceArray = self.distanceArray
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
....
calculateButton.addTarget(self, action: #selector(getRoutes(button:)), for: .touchUpInside)
}
func getRoutes(button: UIButton){
locationArray = set of calculated MKMapItems
calculateRoute(index: 0, distance: 0, routes: [], color: UIColor.green)
locationArray = []
locationArray = set of other MKMapItems (different route essentially)
calculateRoute(index: 0, distance: 0, routes: [], color: UIColor.red)
}
func calculateRoute(index:Int, distance: CLLocationDistance, routes: [MKRoute], color: UIColor){
let request: MKDirectionsRequest = MKDirectionsRequest()
request.source = locationArray[index]
request.destination = locationArray[index+1]
request.requestsAlternateRoutes = true
request.transportType = .walking
let directions = MKDirections(request: request)
directions.calculate(completionHandler: {(response:MKDirectionsResponse?, error: Error?) in
if let routeResponse = response?.routes{
var distVar = distance
var routeVar = routes
routeVar.append(routeResponse[0])
distVar += routeResponse[0].distance
if index + 2 < self.locationArray.count{
self.calculateRoute(index: index+1, distance: distVar, routes: routeVar, color: color)
}
else{
self.routeArray.append(routeVar)
self.distanceArray.append(distVar)
}
}else if let _ = error{
//alert
}
})
}
【问题讨论】:
-
不要直接从按钮触发segue;将 segue 链接到故事板中的视图控制器对象,然后在您准备好时通过
performSegue以编程方式触发 segue。
标签: ios swift uibutton segue uistoryboardsegue