RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1270056
Accepted
Роман
Роман
Asked:2022-04-14 18:02:55 +0000 UTC2022-04-14 18:02:55 +0000 UTC 2022-04-14 18:02:55 +0000 UTC

从 MapView 向 TableViewCell 传递地址时,地址在括号中传递

  • 772

这个本质就是写个培训项目,像往常一样和老师视频,一切OK,我没有。问题在于,在 MapView 上,当您拖动图钉和地址时,由于某种原因,它在括号中,尽管我没有在任何地方添加额外的括号。这是我们拥有的:

在此处输入图像描述 在此处输入图像描述

这是代码:

    import UIKit
    import MapKit
    import CoreLocation


    protocol MapViewControllerDelegate {
    func getAddress(_ address: String?)
}
class MapViewController: UIViewController {

    var mapViewControllerDelegate: MapViewControllerDelegate?
    var place = Place()
    var annatationIndentifier = "annatationIndentifier"
    var locationManager = CLLocationManager()
    var distanceOfMethre: Double = 10_000.00
    var incomeSegueIndetifire = ""
    var placeCoordinate: CLLocationCoordinate2D?
    
    
    
    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var mapPinImage: UIImageView!
    @IBOutlet weak var doneButton: UIButton!
    @IBOutlet weak var addressLable: UILabel!
    @IBOutlet weak var goButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        addressLable.text = ""
        mapView.delegate = self
        setupMapView()
        checkLocationServices()
    }
    
    @IBAction func doneButtonPressed() {
        mapViewControllerDelegate?.getAddress(addressLable.text)
        dismiss(animated: true, completion: nil)
    }
    @IBAction func centerViweInUserLocdtion() {
        showUserLocation()
    }
    
    
    @IBAction func goButtonPressed() {
        getDirections()
    }
    
    
    @IBAction func closeVC() {
        dismiss(animated: true, completion: nil)
    }


    private func setupMapView(){
        
        goButton.isHidden = true
        
        if incomeSegueIndetifire == "showPlace"{
            setupPlaceMark()
            mapPinImage.isHidden = true
            addressLable.isHidden = true
            doneButton.isHidden = true
            goButton.isHidden = false
        }
    }
    
    
    private func setupPlaceMark(){
        guard let location = place.location else {return}
        
        let geocode = CLGeocoder()
        geocode.geocodeAddressString(location) { (placemarks, error) in
            if let error = error {
                print(error)
                return
            }
            
            guard let placemarks = placemarks else { return }
            let placemark = placemarks.first
            let annatation = MKPointAnnotation()
            annatation.title = self.place.name
            annatation.subtitle = self.place.type
            
            guard let placemarkLocation = placemark?.location else {return}
            annatation.coordinate = placemarkLocation.coordinate
            self.placeCoordinate = placemarkLocation.coordinate
            
            self.mapView.showAnnotations([annatation], animated: true)
            self.mapView.selectAnnotation(annatation, animated: true)
        }
    }
    
    private func checkLocationServices(){
        if CLLocationManager.locationServicesEnabled(){
            setupLocationManager()
            checkLocationAutorization()
        } else{
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                self.showAlert(title: "Your Location is not Available",
                          message: "To give permission Go to: Setting -> MyPlaces -> Location")
            }
        }
            
    }
    
    private func setupLocationManager(){
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
    }
    
    private func checkLocationAutorization(){
        switch locationManager.authorizationStatus {
        case .authorizedWhenInUse:
            if incomeSegueIndetifire == "getAddress" {showUserLocation()}
            mapView.showsUserLocation = true
            break
        case .denied:
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                self.showAlert(title: "Your Location is not Available",
                          message: "To give permission Go to: Setting -> MyPlaces -> Location")
            }
            break
        case .notDetermined:
            locationManager.requestWhenInUseAuthorization()
            break
        case .restricted:
            break
        case .authorizedAlways:
            break
        @unknown default:
            print("new case is avalible")
        }
    }
    
    private func showUserLocation(){
        if let location = locationManager.location?.coordinate{
            let region = MKCoordinateRegion(center: location,
                                            latitudinalMeters: distanceOfMethre,
                                            longitudinalMeters: distanceOfMethre)
            mapView.setRegion(region, animated: true)
        }
    }
    
    private func getDirections(){
        guard let location = locationManager.location?.coordinate else {showAlert(title: "Error",
                                                                                  message: "Current location is not found")
                                                                                  return}
        guard let request = createDirectionReqest(for: location) else { showAlert(title: "Error",
                                                                                  message: "Distenation is not fount")
                                                                                  return}
        let direction = MKDirections(request: request)
        direction.calculate { (response, error) in
            if let error = error{
                print(error)
                return
            }
            
            guard let response = response else { self.showAlert(title: "Error",
                                                                message: "Diretion is not avalible")
                                                                return
            }
            for route in response.routes{
                self.mapView.addOverlay(route.polyline)
                self.mapView.setVisibleMapRect(route.polyline.boundingMapRect , animated: true )
                
                let distance = String(format: "%.1f", route.distance / 1000)
                let timeInterval = route.expectedTravelTime
                
                print("Расстояни в пути \(distance) км")
                print("Время в пути \(timeInterval) сек ")
            }
        }
    }
    
    private func createDirectionReqest(for coordinate: CLLocationCoordinate2D) -> MKDirections.Request?{
        guard let distanationCoordinate = placeCoordinate else { return nil }
        let startingLocatoin = MKPlacemark(coordinate: coordinate)
        let destinantion = MKPlacemark(coordinate: distanationCoordinate)
        
        let request = MKDirections.Request()
        request.source = MKMapItem(placemark: startingLocatoin)
        request.destination = MKMapItem(placemark: destinantion)
        request.transportType = .walking
        request.requestsAlternateRoutes = true
        
        return request
    }

    private func getCenterLocation(mapView:MKMapView) -> CLLocation{
        let latitude = mapView.centerCoordinate.latitude
        let longitude = mapView.centerCoordinate.longitude
        return CLLocation(latitude: latitude, longitude: longitude)
    }
    
    
    private func showAlert(title: String, message: String) {
        
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: .default)
        
        alert.addAction(okAction)
        present(alert, animated: true)
    }
}
    
    
    

extension MapViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard !(annotation is MKUserLocation) else { return nil }
        var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annatationIndentifier) as? MKPinAnnotationView
        
        if annotationView == nil{
            annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: annatationIndentifier)
            annotationView?.canShowCallout = true
        }
        
        if let imageData = place.imageData{
            let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
            imageView.layer.cornerRadius = 10
            imageView.clipsToBounds = true
            imageView.image = UIImage(data: imageData)
            annotationView?.rightCalloutAccessoryView = imageView
            
        }
        return annotationView
    }
    
    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
        let center = getCenterLocation(mapView: mapView)
        let geocoder = CLGeocoder()
        geocoder.reverseGeocodeLocation(center) { (placemarks, error) in
            if let error = error {
                print(error)
                return
            }
            
            guard let placemarks = placemarks else {return }
            let placemark = placemarks.first
            let streetName = placemark?.thoroughfare
            let buildNumber = placemark?.subThoroughfare
            
            
            DispatchQueue.main.async {
                if streetName != nil && buildNumber != nil {
                    self.addressLable.text = "(\(streetName!), \(buildNumber!))"
                } else if streetName != nil {
                    self.addressLable.text = "(\(streetName!))"
                } else {
                    self.addressLable.text = ""
                }
            }
        }
    }
    
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let render = MKPolylineRenderer(overlay: overlay as! MKPolyline)
        render.strokeColor = .blue
        return render
    }
}

    extension MapViewController: CLLocationManagerDelegate {
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        checkLocationAutorization()
    }
    
}
swift
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Oleg Soloviev
    2022-04-14T19:37:53Z2022-04-14T19:37:53Z

    删除多余的括号

    if streetName != nil && buildNumber != nil {
        self.addressLable.text = "(\(streetName!), \(buildNumber!))"
    } else if streetName != nil {
        self.addressLable.text = "(\(streetName!))"
    }
    

    如果不需要它们:

    if streetName != nil && buildNumber != nil {
        self.addressLable.text = "\(streetName!), \(buildNumber!)"
    } else if streetName != nil {
        self.addressLable.text = "\(streetName!)"
    }
    

    您还可以摆脱强制展开:

    if let streetName = streetName, let buildNumber = buildNumber {
        self.addressLable.text = "\(streetName), \(buildNumber)"
    } else if let streetName = streetName {
        self.addressLable.text = "\(streetName)"
    }
    
    • 1

相关问题

  • Swift函数:等待数据接收后再返回结果

  • 我在哪里可以找到 SpriteKit 课程/教师/导师?

  • 如果部分中的单元格为空,如何在 tableView 中隐藏部分 SWIFT

  • UITableView 创建部分的问题

  • DataSource 不会在 CollectionView.reloadData() 上触发

  • 无法开启定时器

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5