【问题标题】:Why my table view disappears after scrolling to the bottom?为什么滚动到底部后我的表格视图消失了?
【发布时间】:2019-04-11 04:43:51
【问题描述】:

我不知道为什么当我到达我的表格视图底部后我的表格视图消失了。

这是我的问题的 gif 文件:http://g.recordit.co/4hizPCyctM.gif

这是我的视图控制器中的代码

class CheckoutVC: UIViewController {

    @IBOutlet weak var orderButton: DesignableButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var floatingView: UIView!
    @IBOutlet weak var totalPriceLabel: UILabel!

    private let realm = RealmService.shared.realm
    private var products = [Product]()
    private var userOrder : Order?
    private var productSelected : Product?
    private var cartIsEmpty = false

    override func viewDidLoad() {
        super.viewDidLoad()


    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)


        RealmService.shared.observerRealmErrors() { (error) in
            self.showAlert(alertTitle: "Sorry", alertMessage: error?.localizedDescription ?? "", actionTitle: "OK")
        }

        userOrder = Order.getOrderFromRealmDatabase()
        guard let userOrder = userOrder else {return}
        products = Array(userOrder.products)
        tableView.reloadData()
        totalPriceLabel.text = "Total: \(userOrder.getTotalPriceFormattedWithSeparator())"
        updateUI()



    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        RealmService.shared.stopObservingErrors(in: self)
    }


    private func updateUI() {

        guard let userOrder = userOrder else {return}


        if userOrder.products.isEmpty  {

            tableView.isHidden = true
            cartIsEmpty = true
            orderButton.setTitle("Pilih Barang", for: .normal)

        } else {
            tableView.isHidden = false
            cartIsEmpty = false
            orderButton.setTitle("Pesan Barang", for: .normal)
        }

    }




}


//MARK: - Table View Delegate & Datasource
extension CheckoutVC : UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userOrder?.products.count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: CheckOutStoryboardData.TableViewIdentifiers.checkOutCell.rawValue, for: indexPath) as? CheckOutCell else {return UITableViewCell()}

        guard let userOrderInRealm = userOrder else {return UITableViewCell()}
        let products = userOrderInRealm.products


        cell.productData = products[indexPath.row]
        cell.indexPath = indexPath
        cell.delegate = self

        let stepperValue = Double(products[indexPath.row].quantity)
        cell.stepperValue = stepperValue

        return cell
    }


}

这是我在表格视图单元格中的代码

class CheckOutCell: UITableViewCell {

    var indexPath: IndexPath?
    var delegate: CheckOutCellDelegate?


    @IBOutlet weak var stepperGM: GMStepper!
    @IBOutlet weak var productImageView: UIImageView!
    @IBOutlet weak var productNameLabel: UILabel!
    @IBOutlet weak var subCategoryNameLabel: UILabel!
    @IBOutlet weak var pricePerUnitLabel: UILabel!
    @IBOutlet weak var priceTotalPerItemLabel: UILabel!


    var productData : Product? {
        didSet {
            updateUI()
        }
    }

    var stepperValue : Double? {
        didSet {
             setStepper()
        }
    }


    @IBAction func deleteButtonDidPressed(_ sender: Any) {
        // send data to CheckoutVC
        guard let indexPath = self.indexPath else {return}
        self.delegate?.deleteButtonDidTapped(at: indexPath)
    }

    @IBAction func seeProductButtonDidPressed(_ sender: Any) {
        // send data to CheckoutVC
        guard let indexPath = self.indexPath else {return}
        self.delegate?.viewProductButtonDidTapped(at: indexPath)
    }


    @IBAction func GMStepperDidTapped(_ sender: GMStepper) {
        guard let indexPath = self.indexPath else {return}
        let stepperValue = Int(sender.value)
        self.delegate?.incrementOrDecrementButtonDidTapped(at: indexPath, counterValue: stepperValue)
    }

    func setStepper() {
        guard let stepperValue = stepperValue else {return}
        stepperGM.value = stepperValue
    }

    func updateUI() {

        guard let productData = productData else {return}

        // update UI
        productNameLabel.text = productData.name
        pricePerUnitLabel.text = productData.getFormattedUnitPriceWithSeparator()
        priceTotalPerItemLabel.text = productData.getFormattedTotalPriceWithSeparator()



        //set image
        if let imagePath = productData.imagePaths.first {
            guard let encodedImagePath = imagePath.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else {return}
            guard let url = URL(string: encodedImagePath) else {return}
            productImageView.kf.indicatorType = .activity //loading indicator
            productImageView.kf.setImage(with: url, options: [.transition(.fade(0.2))])
        }

    }


}

这是从领域数据库中获取数据的代码,我从领域数据库中同步获取数据。

static func getOrderFromRealmDatabase() -> Order {

        let userID = "1"
        let realmService = RealmService.shared.realm
        let allOrder = realmService.objects(Order.self)
        let theOrder = allOrder.filter("userID CONTAINS[cd] %@", userID).first

        if let userOrder = theOrder {
            return userOrder
        } else {
            // Order never setted up before in Realm database container
            // then create Order in realm database

            let newOrder = Order()
            newOrder.userID = userID
            newOrder.products = List<Product>()
            RealmService.shared.save(object: newOrder)
            return newOrder

        }

    }

这里出了什么问题,我不明白:(

【问题讨论】:

  • 你说你“我的整个代码中没有 tableView.isHidden”,但你有。它在 VC 的 updateUI 中。我会在那条线上放一个断点,看看它是否/何时/如何被击中。
  • 对不起,新手错误,我将删除。但是 tableView.isHidden = true 的那一行永远不会被执行。我不明白为什么当它向下滚动到底部时它会消失。
  • 去掉 numberOfRowsInSection 中的可选处理,只把它放在 userOrder?.products.count
  • 您是否尝试打印numberOfRowsInSection?这将帮助您了解您的数据源是否导致了问题。其次检查你是否在任何地方隐藏tableView。
  • 更改您的表格视图和滚动视图的颜色,以便您可以检查您的表格视图是否存在,之后您可以使用 numberofrows 进行检查

标签: ios swift uitableview


【解决方案1】:

删除 numberOfRowsInSection 中的可选处理,因为产品计数从不为 0。并且永远不会执行 tableview 隐藏代码。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userOrder?.products.count
    }

【讨论】:

  • 这不起作用,因为它返回一个Int?,其中需要Int。 return userOrder?.products.count ?? 0 很好。
猜你喜欢
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多