UICollectionViewFlowLayoutBreakForInvalidSizes 在调试器中捕获这个

Posted

技术标签:

【中文标题】UICollectionViewFlowLayoutBreakForInvalidSizes 在调试器中捕获这个【英文标题】:UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger 【发布时间】:2018-02-27 07:49:48 【问题描述】:

我正在尝试创建一个座位图布局功能,该功能采用坐标并创建一个我想提供地图包含的部分的值的地图。我正在使用自定义 collectionViewLayout 来创建单元格,但标题中出现了该错误。

这是我的协议-

  protocol SeatMapDelegate: class 

    func getSectionCoordinates() -> [Int]

  

定义-

func getSectionCoordinates() -> [Int] 
        return sectionHeader
    

然后我将值分配给数组

  var sectionHeader = [Int]()
  sectionHeader=(delegate?.getSectionCoordinates())!

【问题讨论】:

【参考方案1】:

下面的代码是我在地图上搜索和查找坐标的项目: 或许能帮到你

//  ViewController.swift
//  MapKit Starter
//
//  Created by Ehsan Amiri on 10/25/16.
//  Copyright © 2016 Ehsan Amiri. All rights reserved.
//

import UIKit
import MapKit
import Foundation

class ViewController: UIViewController 
    @IBOutlet var mapView: MKMapView?
    @IBOutlet weak var text: UITextField!


    var index = 0  
    var indexx = 0



    let locationManager = CLLocationManager()

    var picName:String?


    var place :MKAnnotation?
    var places = [Place]()

    var place1 :MKAnnotation?
    var places1 = [Place]()


    override func viewDidLoad() 

        super.viewDidLoad()

        //downpic()
        self.requestLocationAccess()
        


    override func viewWillAppear(_ animated: Bool) 

        let defaults = UserDefaults.standard
        let age = defaults.integer(forKey: "maptype")
        switch (age) 
        case 0:
            mapView?.mapType = .standard
        case 1:
            mapView?.mapType = .satellite
        case 2:
            mapView?.mapType = .hybrid
        default:
            mapView?.mapType = .standard
        

    




    @IBAction func info(_ sender: Any) 

    


    override var prefersStatusBarHidden: Bool 
        return true
    

    func requestLocationAccess() 
        let status = CLLocationManager.authorizationStatus()

        switch status 
        case .authorizedAlways, .authorizedWhenInUse:
            return

        case .denied, .restricted:
            print("location access denied")

        default:
            locationManager.requestWhenInUseAuthorization()
        
    

    @IBAction func textField(_ sender: Any) 


        mapView?.removeOverlays((mapView?.overlays)!)
        mapView?.removeAnnotations((mapView?.annotations)!)

        self.server()
        _ = Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(self.server), userInfo: nil, repeats: true)




        let when = DispatchTime.now() + 1.5
        DispatchQueue.main.asyncAfter(deadline: when) 
            if self.indexx != 0 
                self.addAnnotations()
                self.addPolyline()
            
        


    


    @objc func server() 


        place = nil
        places = [Place]()

        place1 = nil
        places1 = [Place]()

        indexx = 0

        let id  = text.text
        print("id=\(id!)")

        let url = URL(string: "my server")!
        var request = URLRequest(url: url)
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "POST"
        let postString = "id=\(id!)"
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request)  data, response, error in
            guard let data = data else                                                  // check for fundamental networking error
                print("error=\(String(describing: error))")
                return
            

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200            // check for http errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(String(describing: response))")
            



            let responseString = String(data: data, encoding: .utf8)
            print("responseString = \(String(describing: responseString))")


            let stringgg = "notFound\n\n\n\n"

            if responseString == stringgg 
                print(stringgg)
            else
                let json = try! JSONSerialization.jsonObject(with: data, options: [])
                let betterJSON = json as! NSArray
                let jsonCount = betterJSON.count

                print(betterJSON)

                for item in betterJSON 

                    self.indexx += 1
                    let dictionary = item as? [String : Any]
                    let title = dictionary?["title"] as? String
                    let subtitle = dictionary?["description"] as? String
                    let latitude = dictionary?["latitude"] as? Double ?? 0, longitude = dictionary?["longitude"] as? Double ?? 0

                    self.place = Place(title: title, subtitle: subtitle, coordinate: CLLocationCoordinate2DMake(latitude , longitude ))
                    self.places.append(self.place as! Place)

                    print("latttt",longitude)

                    if self.indexx == 1

                        let shipid = UserDefaults.standard
                        shipid.set(title, forKey: "origin")
                        shipid.set(subtitle, forKey: "date")
                    


                    if  jsonCount == self.indexx
                        let shipid = UserDefaults.standard
                        shipid.set(title, forKey: "location")

                        self.place1 = Place(title: title, subtitle: subtitle, coordinate: CLLocationCoordinate2DMake(latitude , longitude ))
                        self.places1.append(self.place1 as! Place)
                    

                

            
        

        task.resume()
        let when = DispatchTime.now() + 1.5
        DispatchQueue.main.asyncAfter(deadline: when) 
            if self.indexx != 0 
                self.addAnnotations()
                self.addPolyline()
            
        

    


    func addAnnotations() 

        print("hhhh",places)

        mapView?.delegate = self


        mapView?.removeAnnotations((mapView?.annotations)!)
        mapView?.addAnnotations(places1)

        let overlays = places1.map  MKCircle(center: $0.coordinate, radius: 100) 
        mapView?.addOverlays(overlays)

    



    func addPolyline() 
        var locations = places.map  $0.coordinate 
        let polyline = MKPolyline(coordinates: &locations, count: locations.count)
        //        print("Number of locations: \(locations.count)")
        index = locations.capacity



        mapView?.add(polyline)
    




extension ViewController: MKMapViewDelegate 
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 
        if annotation is MKUserLocation 
            return nil
        

        else  
            let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "annotationView") ?? MKAnnotationView()



            annotationView.image = UIImage(named:"place icon")
            annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
            annotationView.canShowCallout = true
            return annotationView
        
    

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer 
        if overlay is MKCircle 
            let renderer = MKCircleRenderer(overlay: overlay)
            renderer.fillColor = UIColor.black.withAlphaComponent(0.5)
            renderer.strokeColor = UIColor.blue
            renderer.lineWidth = 2
            return renderer

         else if overlay is MKPolyline 
            let renderer = MKPolylineRenderer(overlay: overlay)
            renderer.strokeColor = UIColor.orange
            renderer.lineWidth = 2
            return renderer
        


        return MKOverlayRenderer()
    

    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) 


        //guard let annotation = view.annotation as? Place, let title = annotation.title else  return 

        let shipidname = text.text

        let shipid = UserDefaults.standard
        shipid.set(shipidname, forKey: "shipid")

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let secondViewController = storyboard.instantiateViewController(withIdentifier: "shipinfo")
        self.present(secondViewController, animated: true, completion: nil)



    




【讨论】:

我有坐标,但我想在触发错误时以数组的形式将它们传递给自定义集合视图布局子类

以上是关于UICollectionViewFlowLayoutBreakForInvalidSizes 在调试器中捕获这个的主要内容,如果未能解决你的问题,请参考以下文章