Ios 基于用户';什么地方?
我创建了一个包含2个单元格的tableview,每个单元格显示两位参议员(基于您的位置)。我使用CLGeocoder成功地获取用户的zipcode,然后将该值(类型为string)放入在函数外部声明的变量中 理想情况下,我希望转到类中的另一个函数,并使用该字符串变量(应该包含用户的邮政编码)来创建特定的数据。但是,它不起作用 下面是提取邮政编码并将其放入var zipCode中的代码:(请注意,当我运行程序时,if条件中的print函数成功地在终端中打印邮政编码) 我在Ios 基于用户';什么地方?,ios,swift,location,Ios,Swift,Location,我创建了一个包含2个单元格的tableview,每个单元格显示两位参议员(基于您的位置)。我使用CLGeocoder成功地获取用户的zipcode,然后将该值(类型为string)放入在函数外部声明的变量中 理想情况下,我希望转到类中的另一个函数,并使用该字符串变量(应该包含用户的邮政编码)来创建特定的数据。但是,它不起作用 下面是提取邮政编码并将其放入var zipCode中的代码:(请注意,当我运行程序时,if条件中的print函数成功地在终端中打印邮政编码) 我在viewDidLoad()
viewDidLoad()
中调用此函数,然后在viewDidLoad()
函数中,使用if语句,尝试使用邮政编码更改字符串数组names[]
声明为viewDidLoad()
函数正上方的空字符串数组
if zipcode == "94108" {
names[1] = "WORKS!"
print(names)
}
出于某种原因,它不会打印姓名!(请注意,邮政编码实际上是94108,因为当我要求打印“zipcode”时,94108是在控制台中打印的。)这可能是因为保存邮政编码的代码执行过程中有一点延迟,所以运行打印代码时zipcode仍然是“”。完成处理程序已经就位,因为它们在函数完成后执行代码。将以下代码放在打印后(self.zipcode)
希望有帮助 为getTableInfo方法创建一个完成处理程序,如下所示:
typealias ZipcodeCompletionBlock = (String?) -> Void
func getTableInfo(completionBlock: @escaping ZipcodeCompletionBlock) {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
locationManager.requestWhenInUseAuthorization()
locationManager.startMonitoringSignificantLocationChanges()
CLGeocoder().reverseGeocodeLocation(locationManager.location!, completionHandler: {(placemarks, error) -> Void in
if error != nil {
print("Reverse geocoder failed with error" + error!.localizedDescription)
completionBlock(nil)
} else if placemarks!.count > 0 {
let pm = placemarks![0]
self.zipcode = pm.postalCode!
completionBlock(self.zipcode)
} else {
print("Problem with the data received from geocoder")
completionBlock(nil)
}
})
}
现在,您可以在viewDidLoad中这样调用此函数:
self.getTableInfo { zipcode in
if zipcode == "94108" {
self.names[1] = "WORKS!"
print(self.names)
}
}
如果zipcode==“94108语句,您在哪里执行
?您确定CLGeocoder函数已经完成了吗?当放入CLGeocoder()函数中时,它会成功工作,但问题是,当我稍后在程序中打印names[]时,names[1]不包括更新的元素。对-但是reverseGeocode
是一个异步函数,因此执行时会有一点延迟。如果将If语句放在reverseGeocode
函数之后,几乎可以肯定它仍然是““因为reverseGeocode
仍在运行。请参阅其他答案。现在names[]成功地在控制台上打印了新的输出,但为什么这只能在getTableInfo()中工作?如何使它在不同的函数中成功打印?我将从完成块内部调用这些函数,这是确保zipcode已成功设置的唯一方法。
typealias ZipcodeCompletionBlock = (String?) -> Void
func getTableInfo(completionBlock: @escaping ZipcodeCompletionBlock) {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
locationManager.requestWhenInUseAuthorization()
locationManager.startMonitoringSignificantLocationChanges()
CLGeocoder().reverseGeocodeLocation(locationManager.location!, completionHandler: {(placemarks, error) -> Void in
if error != nil {
print("Reverse geocoder failed with error" + error!.localizedDescription)
completionBlock(nil)
} else if placemarks!.count > 0 {
let pm = placemarks![0]
self.zipcode = pm.postalCode!
completionBlock(self.zipcode)
} else {
print("Problem with the data received from geocoder")
completionBlock(nil)
}
})
}
self.getTableInfo { zipcode in
if zipcode == "94108" {
self.names[1] = "WORKS!"
print(self.names)
}
}