UITableView второго уровня не работает в SWIFT - PullRequest
0 голосов
/ 13 января 2020

У меня есть 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
    }

}

Как показано выше, выбор специфика c ячейка (т.е. разговор) в UITableView загружает другой UIViewController через segue. Затем этот 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
    }
}

UITableViewCell для указанного выше UITableView снова находится в отдельном простом классе:

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
    }

}

Все работает до определенной точки. Первое табличное представление загружает и показывает все чаты. Нажатие на чат загружает новый вид с разделом заголовка, показывая Lo go и имя партнера по чату в верхней части экрана и таблицу под ним. Однако эта таблица не содержит ничего. Насколько я понимаю, с помощью этого кода в нем должно отображаться 10 строк с надписью "foo" и 10 раз выводить на консоль слово "Я не сплю".

Что я здесь пропускаю или делаю неправильно?

1 Ответ

0 голосов
/ 13 января 2020

Во втором вашем ViewController вы не устанавливаете UITableViewDelegate и UITableViewDataSource. Что вам нужно добавить к viewDidLoad:

MessageList.delegate = self
MessageList.dataSource = self

Бонус, за будущие изменения self.selectedConversation = indexPath[1] в контроллере первого вида во избежание ошибок - всегда будет работать вторая модель, даже если у вас есть только одна.

Также старайтесь избегать прописных букв для атрибутов, например MessageList -> messageList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...