如何快速修复tableview自动高度?

时间:2019-08-03 04:54:45

标签: json swift uicollectionview tableview uitableviewautomaticdimension

我想在表视图单元格中显示垂直数据收集视图。但是当首次从json重新加载数据时,表格视图的高度不会自动更改。但是向上滚动表格视图时,表格视图的高度将发生如下变化

  1. 从Json重新加载数据时出现了第一张图像: enter image description here

  2. 向上滚动表格视图时的此图像 enter image description here

这是myCode:

  • 视图控制器

    import UIKit
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, reloadTable {
    
      func reloadTableData() {
        self.tableView.reloadData()
        self.tableView.beginUpdates()
        self.tableView.endUpdates()
      }
    
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: Cell.tableView.rawValue)
    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = 100
    tableView.tableFooterView = UIView()
    
    tableView.register(UINib(nibName: "SecondTableViewCell", bundle: nil), forCellReuseIdentifier: "SecondTableViewCell")
    
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         return 2
    }
    
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0{
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "SecondTableViewCell", for: indexPath) as! SecondTableViewCell
        cell.name.text = "first data"
        return cell
    
    }else{
    
        let cell = tableView.dequeueReusableCell(withIdentifier: Cell.tableView.rawValue, for: indexPath) as! TableViewCell
        cell.setNeedsLayout()
        cell.layoutIfNeeded()
        return cell
      }
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
       if indexPath.row == 0{
          return 100
       }else {
          return UITableView.automaticDimension
       }
      }
     }
    

这是我的tableview单元格:

  • TableViewCell

    import UIKit
    import Alamofire
    import SwiftyJSON
    
    struct dataJSON {
       var name: String
    }
    
    protocol reloadTable {
     func reloadTableData()
    }
    
    class TableViewCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
    
    
    var reload: reloadTable?
    
    var dataJson : [dataJSON] = []
    
    @IBOutlet var collectionView: UICollectionView!
    
    override func awakeFromNib() {
      super.awakeFromNib()
    
      fetchData()
    
      collectionView.delegate = self
      collectionView.dataSource = self
      collectionView.isScrollEnabled = false
      collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: Cell.collView.rawValue)
    
      let collViewLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
      collViewLayout.itemSize = UICollectionViewFlowLayout.automaticSize
      layoutIfNeeded()
      setNeedsLayout()
    
      }
    
      func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
     }
    
      func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return dataJson.count
     }
    
      func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Cell.collView.rawValue, for: indexPath) as! CollectionViewCell
         cell.detail.text = dataJson[indexPath.row].name
         return cell
     }
    
      func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
         return CGSize(width: collectionView.frame.size.width / 2 - 10, height:  300)
     }
    
      func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
         return 5
     }
    
      func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 5
     }
    
      func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 3, left: 3, bottom: 3, right: 3)
      }
    
      func fetchData(){
       Alamofire.request("https://jsonplaceholder.typicode.com/users", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON{
        (response) in
    
        switch response.result{
            case .success(let value):
                print(value)
                let json = JSON(value)
    
                let name = json["name"].stringValue
                print("nameesss: \(name)")
    
                json.array?.forEach({ (item) in
                    let data = item["name"].stringValue
                    self.dataJson.append(dataJSON(name: data))
                })
    
                self.collectionView.reloadData()
                self.reload?.reloadTableData()
    
            case .failure(let error):
                print(error)
        }
      }
    }
    
    override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
       self.collectionView.frame = CGRect(x: 0, y: 0, width: targetSize.width, height: 600)
       self.collectionView.layoutIfNeeded()
       return self.collectionView.collectionViewLayout.collectionViewContentSize
        }
      }
    

3 个答案:

答案 0 :(得分:0)

尝试

 DispatchQueue.main.async { [weak self] in
        self?.tableView.reloadData()
    }

答案 1 :(得分:0)

插入数据后,必须使用self.view.layoutSubviews()更新子视图。

答案 2 :(得分:0)

从连接检查器建立委托和数据源连接。 单击并将出口从连接检查器拖放到文件所有者以获取数据源和委托。

enter image description here