Swift TableView使用错误的索引路径(倒数第二选择)选择到新的ViewController [英] Swift TableView segue to new ViewController with wrong index path (penultimate selection)

查看:125
本文介绍了Swift TableView使用错误的索引路径(倒数第二选择)选择到新的ViewController的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个奇怪的问题.我有两个TableViews,一个用于显示项目,另一个用于显示所有团队成员.对于这两个TableView,我都有相同的错误.

I have a weird problem. I have two TableViews one for showing Projects and one for showing all Team Members. With both TableViews I have the same bug.

当用户单击项目/团队成员时,我要显示其详细信息.

When a user clicks on a Project/ Team Member I want to show the Details for it.

奇怪的是,当运行应用程序并且我第一次选择项目/团队成员时,什么都没有发生.然后,当我选择另一个时,它会向我显示上一个选定的细节.我希望有人可以帮助我.

The weird thing is, when running the app and I select a Project/ Team Member for the first time, nothing is happening. When I then select another one, it shows me the details of the previous selected one. I hope someone can help me with that.

还有一个奇怪的事情,即从Firebase数据库中删除了条目"Sarra Fezzani",并且该应用程序是干净的版本,但仍显示了几次...

Also a weird thing is, the entry "Sarra Fezzani" was deleted from the Firebase Database and the app was clean build, but it still shows it several times...

由于两个代码都非常相似,因此我将仅发布ProjetTableViewController的代码,而不会发布其他文件.

Since both codes are pretty similiar I will only post the Code for the ProjetTableViewController without the other files.

//
//  TeamViewController.swift
//  ProLabArtv2
//

import UIKit

class TeamViewController: UIViewController {


// MARK: - Properties


    @IBOutlet weak var memberTableView: UITableView!
    @IBOutlet weak var addTeamMember: UIButton!

    var members = [TeamMember]()
    var textToBeSent: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        setUpElements()

        UserService.members(for: User.current) { (members) in
              self.members = members
              self.memberTableView.reloadData()
          }

    }

// MARK: - Element Style
    func setUpElements() {
         // Mark: Style the elements
        Utilities.addShadowtoButton(addTeamMember)
    }


    func configureTableView() {
        // remove separators for empty cells
        memberTableView.tableFooterView = UIView()
        // remove separators from cells
        memberTableView.separatorStyle = .none
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toMemberDetails" {
            let destVC = segue.destination as! TeamMemberDetailsViewController
            destVC.member = sender as? TeamMember
        }
    }
}


// MARK: - UITableViewDataSource

extension TeamViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

        let member = members[indexPath.row]

        let cell = memberTableView.cellForRow(at: indexPath)

        print(members)

        performSegue(withIdentifier: "toMemberDetails", sender: member)
    }

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


//    func numberOfSections(in tableView: UITableView) -> Int {
//        return members.count
//    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let member = members[indexPath.row]

            let cell = memberTableView.dequeueReusableCell(withIdentifier: "TeamMemberCell") as! TeamMemberCell
        cell.jobLabel.text = members[indexPath.row].memberJob
        cell.nameLabel.text = members[indexPath.row].memberName


            return cell
        }
    }


// MARK: - UITableViewDelegate

extension TeamViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     return 80
    }
}


import UIKit

class TeamMemberCell: UITableViewCell {


// MARK: - Properties

    @IBOutlet weak var nameLabel: UILabel!
   @IBOutlet weak var jobLabel: UILabel!



static let height: CGFloat = 78

   override func awakeFromNib() {
       super.awakeFromNib()
       // Initialization code
   }

   override func setSelected(_ selected: Bool, animated: Bool) {
       super.setSelected(selected, animated: animated)

       // Configure the view for the selected state
   }

}

import Foundation
import UIKit
import FirebaseDatabase.FIRDataSnapshot




class TeamMember {

//      Next let's add properties to store all the additional information we need. Add the following to your post class.
    var key: String?
        let memberName: String
        let memberJob: String
        let memberLanguage: String
        let memberPrice: String
        let memberSpecification: String




//    You'll get some compiler errors for not having any initializers or default values for certain properties. Let's go ahead and fix that:

    init(memberName: String, memberJob: String, memberLanguage: String, memberPrice: String, memberSpecification: String) {
        self.memberName = memberName
        self.memberJob = memberJob
        self.memberLanguage = memberLanguage
        self.memberPrice = memberPrice
        self.memberSpecification = memberSpecification


    }

    var dictValue: [String : Any] {


        return ["memberName" : memberName,
                "memberJob" : memberJob,
                "memberLanguage" : memberLanguage,
                "memberPrice" : memberPrice,
                "memberSpecification" : memberSpecification]

    }
    init?(snapshot: DataSnapshot) {
        guard let dict = snapshot.value as? [String : Any],
            let memberName = dict["memberName"] as? String,
            let memberJob = dict["memberJob"] as? String,
            let memberLanguage = dict["memberLanguage"] as? String,
            let memberPrice = dict["memberPrice"] as? String,
            let memberSpecification = dict["memberSpecification"] as? String






            else { return nil }

        self.key = snapshot.key
        self.memberName = memberName
        self.memberJob = memberJob
        self.memberLanguage = memberLanguage
        self.memberPrice = memberPrice
        self.memberSpecification = memberSpecification

    }
}

import Foundation
import FirebaseAuth.FIRUser
import FirebaseDatabase
import FirebaseUI
import FirebaseAuth


struct UserService {


    static func members(for user: User, completion: @escaping ([TeamMember]) -> Void) {
        let ref = Database.database().reference().child("team").child(user.uid)

           ref.observeSingleEvent(of: .value, with: { (snapshot) in
               guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
                   return completion([])
               }

               let members = snapshot.reversed().compactMap(TeamMember.init)
               completion(members)
           })
       }

}

//
//  TeamMemberDetailsViewController.swift
//  ProLabArtv2
//
//  Created by Manu on 09.06.20.
//  Copyright © 2020 Manuel Knott. All rights reserved.
//

import UIKit
import FirebaseDatabase
import FirebaseAuth
import FirebaseStorage

class TeamMemberDetailsViewController: UIViewController {

// MARK: - Properties

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var jobLabel: UILabel!
    @IBOutlet weak var specificationLabel: UILabel!
    @IBOutlet weak var languageLabel: UILabel!
    @IBOutlet weak var priceLabel: UILabel!
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet weak var newScoreButton: UIButton!
    @IBOutlet weak var projectsPartButton: UIButton!


    var member: TeamMember?

    override func viewDidLoad() {
        super.viewDidLoad()

         setUI()

    }

    func setUI() {

        nameLabel.text = member?.memberName
        jobLabel.text = member?.memberJob
        specificationLabel.text = member?.memberSpecification
        languageLabel.text = member?.memberLanguage
        priceLabel.text = member?.memberPrice
//        scoreLabel.text = member?.
    }


}

那是ProjectViewController的那个,我正在使用switch语句...

And that's the one for the ProjectViewController, where I am using a switch statement...

//  HomeViewController.swift
//  ProLabArtv2
//

//

import UIKit
import Kingfisher
import Foundation
import FirebaseStorage
import FirebaseDatabase

class HomeViewController: UIViewController  {

    // MARK: - Properties

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var addProject: UIButton!


    var posts = [Post]()



    var textToBeSent: String = ""
    override func viewDidLoad() {
        super.viewDidLoad()

        UserService.posts(for: User.current) { (posts) in
            self.posts = posts
            self.tableView.reloadData()
        }

        Utilities.addShadowtoButton(addProject)

    }

    func configureTableView() {
        // remove separators for empty cells
        tableView.tableFooterView = UIView()
        // remove separators from cells
        tableView.separatorStyle = .none
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toDetails" {
            let destVC = segue.destination as! ShowProjectDetailsViewController
            destVC.post = sender as? Post
        }
    }

}

// MARK: - UITableViewDataSource

extension HomeViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let post = posts[indexPath.row]
        performSegue(withIdentifier: "toDetails", sender: post)
    }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return 2
  }

    func numberOfSections(in tableView: UITableView) -> Int {
        return posts.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let post = posts[indexPath.section]

        switch indexPath.row {
        case 0:

            let cell = tableView.dequeueReusableCell(withIdentifier: "PostImageCell") as! PostImageCell
            let imageURL = URL(string: post.imageURL)
            cell.postImageView.kf.setImage(with: imageURL)

            return cell

        case 1:

            let cell = tableView.dequeueReusableCell(withIdentifier: "PostSubCell") as! PostSubCell
            cell.projectName.text = post.projectTitle



            return cell





        default:
            fatalError("Error: unexpected indexPath.")
        }
    }

}

// MARK: - UITableViewDelegate

extension HomeViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        switch indexPath.row {
        case 0:

           let post = posts[indexPath.section]
           return post.imageHeight

        case 1:

       return PostSubCell.height

        default:
            fatalError()
        }
    }
    }

希望有人可以帮助我:)

Hopefully someone can help me :)

推荐答案

这是我们在某些时候都犯的那些错误之一,通常是由于没有仔细阅读自动完成功能.

This is one of those errors we've all made at some point, usually by not reading the autocomplete carefully.

您的代码是

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)

您使用的是 didDeselectRowAt 而不是 didSelectRowAt 方法.这意味着它将在该行失去焦点时运行它(当您单击另一行时).

You've used the didDeselectRowAt rathert than didSelectRowAt method. Which means that it runs it when that row loses focus (which will be when you click on another row).

您需要

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        ...

这篇关于Swift TableView使用错误的索引路径(倒数第二选择)选择到新的ViewController的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆