swift - 二级 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 次“我醒了”。
我在这里错过了什么或做错了什么?
解决方案
在您的第二个 ViewController 中,您没有设置UITableViewDelegate
and UITableViewDataSource
。您需要添加的内容viewDidLoad
:
MessageList.delegate = self
MessageList.dataSource = self
奖金,为了防止错误的第一个视图控制器的未来变化self.selectedConversation = indexPath[1]
- 它总是需要第二个模型,即使你只有一个。
另外,尽量避免使用大写的属性,例如 MessageList -> messageList。
推荐阅读
- c# - 为什么我的代码不能在 Unity 中运行?统一 C#
- python - 如何解释这两个未压缩的 zlib 样本?
- css - AGM 地图打印显示打印输出中的间隙
- javascript - 关于为搜索框设置操作的问题
- python - futures.ProcessPoolExecutor 的不一致行为
- javascript - 测试 Cafe Headless 能见度检查
- list - Kotlin:将列表分组为地图的地图
- computer-vision - 为什么在图像上应用光流不能产生准确的下一帧
- javascript - 仅使用 javascript 获取未选中的复选框
- sql - 大型增长表sql的良好设计