首页 > 解决方案 > 二级 UITableView 在 SWIFT 中不起作用

问题描述

我有一个这样的 UITableView:

import UIKit
import SDWebImage

class ChatViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var ConversationList: UITableView!
    let apiService = APIService()
    var conversations: [Conversation] = []
    var selectedConversation: Int?



    override func viewDidLoad() {
        super.viewDidLoad()
        ConversationList.separatorStyle = .none
        ConversationList.dataSource = self
        ConversationList.delegate = self

        // load Conversations
        self.apiService.getConversations(completion: {result in
            switch result {
            case .success(let conversations):
                DispatchQueue.main.async {
                    print("NUMBER OF CONVERSATIONS: ", conversations.count)
                    self.conversations = conversations
                    self.ConversationList.reloadData()
                }
            case .failure(let error):
                print("An error occured \(error.localizedDescription)")
            }
        })
    }

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



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ChatViewCell", for: indexPath) as! ChatViewCellController

        cell.UserName.text = self.conversations[indexPath[1]].participants![1].username
        let imgURL = URL(string: self.conversations[indexPath[1]].participants![1].profileimage!)
        cell.UserLogo.sd_setImage(with: imgURL, placeholderImage: UIImage(named: "icon.turq.png"))
        return cell
    }



    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("selected row number ", indexPath)
        self.selectedConversation = indexPath[1]
        self.performSegue(withIdentifier: "ChatToChatDetail", sender: self)
    }



    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destination = segue.destination as! ChatDetailViewController
        destination.name = self.conversations[self.selectedConversation!].participants![1].username!
        destination.img = self.conversations[self.selectedConversation!].participants![1].profileimage!
    }


}

UITableViewCell 位于一个单独的简单类中,如下所示:

import UIKit

class ChatViewCellController: UITableViewCell {

    @IBOutlet weak var UserLogo: UIImageView!
    @IBOutlet weak var UserName: UILabel!



    override func awakeFromNib() {
        super.awakeFromNib()
        self.UserLogo.clipsToBounds = true
        self.UserLogo.layer.cornerRadius = self.UserLogo.frame.size.width / 2
    }



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

        // Configure the view for the selected state
    }

}

如上所示,在 UITableView 中选择一个特定的单元格(即会话)通过 segue 加载另一个 UIViewController。该 UIViewController 然后包含另一个 UITableView:

import UIKit
import SDWebImage

class ChatDetailViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var UserLogo: UIImageView!
    @IBOutlet weak var UserName: UILabel!
    @IBOutlet weak var MessageList: UITableView!
    var name: String = ""
    var img: String = ""
    let apiService = APIService()
    var messages: [ChatMessage] = []


    override func viewDidLoad() {
        super.viewDidLoad()
        // prepare header section:
        self.MessageList.separatorStyle = .none
        let imgURL = URL(string: self.img)
        self.UserLogo.sd_setImage(with: imgURL, placeholderImage: UIImage(named: "icon.turq.png"))
        self.UserLogo.clipsToBounds = true
        self.UserLogo.layer.cornerRadius = self.UserLogo.frame.size.width / 2
        self.UserName.text = self.name

        // TODO: load messages

        self.MessageList.reloadData()
    }



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



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MessageViewCell", for: indexPath) as! ChatMessageViewCellController
        cell.ChatMessageText.text = "foo"

        return cell
    }
}

上述 UITableView 的 UITableViewCell 再次位于一个单独的简单类中:

import UIKit

class ChatMessageViewCellController: UITableViewCell {

    @IBOutlet weak var ChatMessageBubble: UIView!
    @IBOutlet weak var ChatMessageText: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        print("I'm awake")
    }

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

        // Configure the view for the selected state
    }

}

一切正常,直到某一点。第一个表视图加载并显示所有聊天。单击聊天会加载带有标题部分的新视图,在屏幕顶部显示聊天伙伴的徽标和名称,并在其下方显示一个表格。但是,该表不包含任何内容。据我了解,使用此代码,它应该显示 10 行说“foo”并在控制台上打印 10 次“我醒了”。

我在这里错过了什么或做错了什么?

标签: swiftuitableview

解决方案


在您的第二个 ViewController 中,您没有设置UITableViewDelegateand UITableViewDataSource。您需要添加的内容viewDidLoad

MessageList.delegate = self
MessageList.dataSource = self

奖金,为了防止错误的第一个视图控制器的未来变化self.selectedConversation = indexPath[1]- 它总是需要第二个模型,即使你只有一个。

另外,尽量避免使用大写的属性,例如 MessageList -> messageList。


推荐阅读