我正在尝试使用多个自定义 UITableViewCells,而不必为每个选项复制 cellForRowAt 方法中的所有代码
我正在创建一个用于学习目的的实时聊天应用程序,它根据消息发件人是否是用户来区分单元格类别。我知道如何使用 if-else 或 switch 语句为 cellForRowAt 提供相关的 ReusableCell,但问题是:
- 处理单元格属性的 200 行代码没有 除非我在之外定义它,否则可以访问单元格变量 开关/如果语句。
- 当我在函数头中定义它时,它需要一个预定义类型
- 如果我选择任一类型作为默认类型并声明它,我会收到它们不兼容的错误,而实际上从代码的角度来看它们是 100% 相同的(只是设计不同) .
- 如果我将它声明为通用 UITableViewCell 类型,那么该类型将缺少我的所有自定义属性。
- 如果我尝试创建一个公共(public)基类,我将无法链接我的 @IBOutlets 和@IBActions,这是大部分的共同点。 如果我尝试构建一个协议(protocol),该协议(protocol)不支持任何东西 @IB。
如果我可以在 if/switch 语句中声明单元格变量并使其对我的其余代码可见,而不必将其嵌套在 if/switch 中,则可以解决此问题。有什么办法吗?
附言。我知道我可以通过为自定义 tableview 单元格的每个变体复制 200 行代码来解决这个问题,但我的直觉告诉我必须有更聪明的方法来做到这一点。
这里有一个代码片段来说明这个问题:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Get the info about the message from an array
let message = messageArray[indexPath.row]
// Pick cell style based on who the sender is
var isUsersPost = 0
if message.sender == userID {
isUsersPost = 1
}
switch isUsersPost {
case 1:
let cell = chatTableView.dequeueReusableCell(withIdentifier: "rightChatCell") as! RightChatViewCell
case 0:
let cell = chatTableView.dequeueReusableCell(withIdentifier: "chatCell") as! ChatViewCell
default:
let cell = chatTableView.dequeueReusableCell(withIdentifier: "chatCell") as! ChatViewCell
}
// fill in the cell properties with data - ca 200 lines of logic that is already optimised as much as reasonable
cell.messageTextLabel = message.text
... etc
return cell
}
这是我的 TableViewCell 类(它们是相同的):
import UIKit
class RightChatViewCell: UITableViewCell {
var likeTask : (() -> Void)? = nil
var commentTask : (() -> Void)? = nil
var photoTask : (() -> Void)? = nil
@IBOutlet weak var messageBoxView: UIView!
@IBOutlet weak var messageTextLabel: UILabel!
@IBOutlet weak var nicknameLabel: UILabel!
@IBOutlet weak var profilePhotoView: UIImageView!
@IBOutlet weak var messageDateLabel: UILabel!
@IBOutlet weak var messageCommentLabel: UILabel!
@IBOutlet weak var likeButton: UIButton!
@IBOutlet weak var messageLikesLabel: UILabel!
@IBOutlet weak var messagePhotoView: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
messagePhotoView.isHidden = true
self.selectionStyle = UITableViewCellSelectionStyle.none
// Add photo Tap gesture recognizer
messagePhotoView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(photoTapped)))
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@objc func photoTapped() {
print("Photo tapped")
if let btnAction = self.photoTask
{
btnAction()
}
}
@IBAction func likeTapped(_ sender: Any) {
print("Like tapped")
if let btnAction = self.likeTask
{
btnAction()
}
}
@IBAction func commentTapped(_ sender: Any) {
print("Comment tapped")
if let btnAction = self.commentTask
{
btnAction()
}
}
}
最佳答案
如果在类级别声明变量为null、0或'';然后在您的 try 和 catch 中实例化它们,尽管您可能需要在类中包含一个异常处理程序,因为如果实例化不成功,您将需要处理该问题。
查看有关作用域和变量的链接 https://www.cs.umd.edu/~clin/MoreJava/Objects/local.html
关于ios - 如何在 if/switch 语句中声明一个将变为全局的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186673/