TableView的底部背景显示空白单元格

问题描述 投票:1回答:1

enter image description here我有一个UITableView,它具有xib文件作为单元格,并且都按预期工作,但是仅当我向下滚动时,最后一个单元格没有背景色。仅当我向下滚动然后弹出回到正常位置时才会发生。我本质上想知道如何将单元格的颜色更改为我的背景色。谢谢。

//
//  BlogViewController.swift
//  testAPI
//
//  Created by Dilan Piscatello on 4/2/20.
//  Copyright © 2020 Dilan Piscatello. All rights reserved.
//
import Foundation
import UIKit
import Firebase
class BlogViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {



    var x = 0
    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0{
           return 1

        }else{
           return posts.count
        }


    }
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if indexPath.section == 0{
            let cell = Bundle.main.loadNibNamed("QuestionTableViewCell", owner: self, options: nil)?.first as! QuestionTableViewCell


            print("this is how many times it ran")

            cell.setPost(question: self.question)
            return cell
        }
        else{
        let cell = tableView.dequeueReusableCell(withIdentifier: "postcell", for: indexPath) as! PostTableViewCell
        cell.setPost(post: posts[indexPath.row])

        return cell
        }
    }
    var question = "sdfsdfs"


    var tableView:UITableView!


    var lastUploadPostID:String?


    var discussion:UILabel! = UILabel()

    var posts = [Post]()
    var fetchingMore = false
    var endReached = false
    let leadingScreensForBatching:CGFloat = 3.0

    var cellHeights: [IndexPath:CGFloat] =  [:]
    var refreshControl:UIRefreshControl!

    var postRef:DatabaseReference{
        return Database.database().reference().child("posts")
    }

    var oldPostQuery:DatabaseQuery{

        var queryRef:DatabaseQuery
        let lastPost = self.posts.last
               if lastPost == nil{
                   queryRef = postRef.queryOrdered(byChild: "timestamp")
               }else{
                   let lastTimestamp = lastPost!.createdAt.timeIntervalSince1970*1000
                   queryRef = postRef.queryOrdered(byChild: "timestamp").queryEnding(atValue: lastTimestamp)
               }
        return queryRef
    }
    var newPostQuery:DatabaseQuery{

        var queryRef:DatabaseQuery
        let firstPost = self.posts.first
               if firstPost == nil{
                   queryRef = postRef.queryOrdered(byChild: "timestamp")
               }else{
                   let firstTimestamp = firstPost!.createdAt.timeIntervalSince1970*1000
                   queryRef = postRef.queryOrdered(byChild: "timestamp").queryStarting(atValue: firstTimestamp)
               }
        return queryRef
    }
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

    func hi(){
    let db = Firestore.firestore()

            db.collection("blog").document("question").getDocument { (document,error) in

                       if error != nil{
                           print("cant get data")

                       }
                       if document != nil && document!.exists{

                       if let documentdata = document?.data() {
                        self.question = documentdata["question"] as! String
                        self.tableView.reloadData()




                        }
        }

    }
}
    override func viewDidLoad() {
        super.viewDidLoad()



              discussion.text = "Discussion"
                     //longTitleLabel.font = ................
                     discussion.font = UIFont(name: "HelveticaNeue-Bold", size: 31)


                     discussion.translatesAutoresizingMaskIntoConstraints = false
                     if let navigationBar = self.navigationController?.navigationBar {


                 navigationBar.addSubview(discussion)
                        //navigationBar.shadowImage = UIImage()
                       // navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
                       // navigationBar.isTranslucent = true

                        navigationBar.barTintColor =  UIColor( red: 128/255, green: 117/255, blue: 255/255, alpha: 1)
                       discussion.leftAnchor.constraint(equalTo: navigationBar.leftAnchor, constant: 22).isActive = true
                        discussion.widthAnchor.constraint(equalToConstant: 300).isActive = true




        tableView = UITableView()
                        tableView.translatesAutoresizingMaskIntoConstraints = false
            self.tableView.separatorStyle = .none
        view.addSubview(tableView)
        hi()
        print(question)

        // Do any additional setup after loading the view.
        let cellNib = UINib(nibName: "PostTableViewCell", bundle: nil)
        tableView.register(cellNib, forCellReuseIdentifier: "postcell")
        var layoutGuide:UILayoutGuide!
        layoutGuide = view.safeAreaLayoutGuide
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10).isActive = true
        tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 40).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10).isActive = true
                        tableView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true

        tableView.delegate = self
        tableView.dataSource = self
        tableView.tableFooterView = UIView()
        tableView.reloadData()

        refreshControl = UIRefreshControl()
        tableView.refreshControl = refreshControl
        refreshControl.addTarget(self, action: #selector(handleRefresh), for: .valueChanged)



        beginBatchFetch()
        }

    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

       // if let navigationController = navigationController as? ScrollingNavigationController {
         //   navigationController.followScrollView(tableView, delay: 0.0)
        //}
        listenForNewPosts()
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        stopListeningForNewPosts()
    }

    @objc func handleRefresh(){
    print()

       newPostQuery.queryLimited(toFirst: 20).observeSingleEvent(of: .value, with: { (snapshot) in

       var tempPosts = [Post]()
       let firstPost = self.posts.first
             for child in snapshot.children{
                 if let childSnapshot = child as? DataSnapshot,
                     let dict = childSnapshot.value as? [String:Any],
                   let post = Post.parse(childSnapshot.key, dict),
                   childSnapshot.key != firstPost?.id{
                       tempPosts.insert(post, at: 0)
                   }

         }
        self.posts.insert(contentsOf: tempPosts, at: 0)
        self.tableView.reloadData()
        self.refreshControl.endRefreshing()

       //let newIndexPaths = (1..<tempPosts.count).map { i in
        //  return IndexPath(row: i, section: 1)
      //}
    //self.tableView.insertRows(at: newIndexPaths, with: .top)
   // self.refreshControl.endRefreshing()
       // self.tableView.scrollToRow(at: IndexPath(row:0,section: 0), at: .top, //animated:true)
        //self.listenForNewPosts()
        //return completion(tempPosts)
             //self.posts = tempPosts
             //self.tableView.reloadData()
         })
    }

    func fetchPosts(completion: @escaping(_ posts:[Post])->()){



        oldPostQuery.queryLimited(toLast: 20).observeSingleEvent(of: .value, with: { (snapshot) in

            var tempPosts = [Post]()
            let lastPost = self.posts.last
                  for child in snapshot.children{
                      if let childSnapshot = child as? DataSnapshot,
                          let dict = childSnapshot.value as? [String:Any],
                        let post = Post.parse(childSnapshot.key, dict),
                        childSnapshot.key != lastPost?.id{
                            tempPosts.insert(post, at: 0)
                        }

              }

                return completion(tempPosts)
                  //self.posts = tempPosts
           //Zself.tableView.reloadData()
              })


    }

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cellHeights[indexPath] = cell.frame.size.height
        cell.selectionStyle = UITableViewCell.SelectionStyle.none
    }
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return cellHeights[indexPath] ?? 72.0
    }
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
           let offsetY = scrollView.contentOffset.y
           let contentHeight = scrollView.contentSize.height
           if offsetY > contentHeight - scrollView.frame.size.height * leadingScreensForBatching {

               if !fetchingMore && !endReached {
                   beginBatchFetch()
               }
           }
       }

    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation

        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.


    func beginBatchFetch(){
        fetchingMore = true
        fetchPosts{ newPosts in
            self.posts.append(contentsOf: newPosts)
            self.endReached = newPosts.count == 0
            self.fetchingMore = false

            UIView.performWithoutAnimation {
                self.tableView.reloadData()

                self.listenForNewPosts()
            }
        }
        //fetch the post
    }
    var postListenerHandle:UInt?

    func listenForNewPosts(){

        guard !fetchingMore  else{ return}
        //to avoid the listeners twice (duplicate)
        stopListeningForNewPosts()

        postListenerHandle = newPostQuery.observe(.childAdded) { (snapshot) in
            if snapshot.key != self.posts.first?.id {
            if let data = snapshot.value as? [String:Any],
                //let post = Post.parse(snapshot.key,data)
                let _ = Post.parse(snapshot.key,data){

                self.stopListeningForNewPosts()

                if snapshot.key == self.lastUploadPostID{
                    self.handleRefresh()
                    self.lastUploadPostID = nil
                }else{

                }
                }
            }
        }
    }
    func stopListeningForNewPosts(){
        if let handle = postListenerHandle{
            newPostQuery.removeObserver(withHandle: handle)
            postListenerHandle = nil
        }
    }
   // func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
        //if let navigationController = navigationController as? //ScrollingNavigationController {
         //   navigationController.showNavbar(animated: true, scrollToTop: true)
        //}
      //  return true
    //}
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if let newPostNavBar = segue.destination as? UINavigationController,
            let newPostVC = newPostNavBar.viewControllers[0] as? WritePostViewController{
            newPostVC.delegate = self
        }
    }
}
extension BlogViewController: NewPostVCDelegate{
    func didUploadPost(withID id: String) {
        print("what up this is the id \(id)")
        self.lastUploadPostID = id
    }
}

swift xcode
1个回答
0
投票

在情节提要中,将tableView内的最后一个元素添加为高度等于1的透明视图,>

© www.soinside.com 2019 - 2024. All rights reserved.