我正在尝试使用多个自定义UITableViewCell,而不必为每个选项复制cellForRowAt方法中的所有代码
我正在创建一个实时聊天应用程序,用于学习目的,根据消息发送者是用户的天气来区分小区类。我知道如何使用if-else或switch语句给cellForRowAt相关的ReusableCell,但问题是:
如果我可以在if / switch语句中声明单元格变量并使其对我的其余代码可见而不必将其嵌套在if / switch中,则可以解决此问题。有没有办法做到这一点?
PS。我知道我可以通过为自定义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()
}
}
}
答案 0 :(得分:-2)
如果您将类级别的变量声明为null,则为0或''然后在try和catch中实例化它们,尽管您可能需要在类上包含异常处理程序,因为如果实例化不成功,您将需要处理该问题。
查看有关范围和变量的链接 https://www.cs.umd.edu/~clin/MoreJava/Objects/local.html