簡體   English   中英

Swift TableView 使用錯誤的索引路徑轉至新的 ViewController(倒數第二個選擇)

[英]Swift TableView segue to new ViewController with wrong index path (penultimate selection)

我有一個奇怪的問題。 我有兩個 TableView,一個用於顯示項目,一個用於顯示所有團隊成員。 對於這兩個 TableView,我都有同樣的錯誤。

當用戶單擊項目/團隊成員時,我想顯示它的詳細信息。

奇怪的是,當我 select 第一次運行該應用程序時,我是項目/團隊成員,沒有任何反應。 當我然后 select 另一個時,它顯示了我之前選擇的一個的詳細信息。 我希望有人可以幫助我。

問題樣本

同樣奇怪的是,條目“Sarra Fezzani”已從 Firebase 數據庫中刪除,應用程序是干凈的構建,但它仍然多次顯示......

由於這兩個代碼非常相似,所以我只會發布 ProjetTableViewController 的代碼,而不會發布其他文件。

//
//  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 語句......

//  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()
        }
    }
    }

希望有人能幫助我:)

這是我們在某些時候都犯過的錯誤之一,通常是因為沒有仔細閱讀自動完成。

你的代碼是

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

您使用的是didDeselectRowAt而不是didSelectRowAt方法。 這意味着它會在該行失去焦點時運行它(當您單擊另一行時)。

你需要

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

您使用了錯誤的委托方法。 選擇而不是取消選擇單元格時執行 segue

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM