ios - 如何在 if/switch 语句中声明一个将变为全局的变量?

标签 ios swift uitableview swift3

我正在尝试使用多个自定义 UITableViewCells,而不必为每个选项复制 cellForRowAt 方法中的所有代码

我正在创建一个用于学习目的的实时聊天应用程序,它根据消息发件人是否是用户来区分单元格类别。我知道如何使用 if-else 或 switch 语句为 cellForRowAt 提供相关的 ReusableCell,但问题是:

  1. 处理单元格属性的 200 行代码没有 除非我在之外定义它,否则可以访问单元格变量 开关/如果语句。
  2. 当我在函数头中定义它时,它需要一个预定义类型
  3. 如果我选择任一类型作为默认类型并声明它,我会收到它们不兼容的错误,而实际上从代码的角度来看它们是 100% 相同的(只是设计不同) .
  4. 如果我将它声明为通用 UITableViewCell 类型,那么该类型将缺少我的所有自定义属性。
  5. 如果我尝试创建一个公共(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/

相关文章:

swift iOS11 - 识别 keyboardSize 高度不再起作用

ios - UITableView 异步图像加载 - 滚动之前不布局

ios - 带有 AutoLayout 的 UITableViewCell - contentView 宽度约束失败

ios - WiFi打开时如何在iPhone中获取移动数据状态

ios - 如何在 swift iOS 中集成 Tez 支付网关?

swift - 菜单栏应用程序中的 OS X 键事件 (Swift)

swift - swift 中的类到协议(protocol)对话

ios - 自动布局工作错误

ios - 在表格单元格中显示自定义分隔符 UIView

ios - 防止在您发布到 PubNub 时向您发送推送通知