iOS Swift: 正确初始化 TableViewCell

iOS Swift: Properly Initializing a TableViewCell

为了学习 iOS 开发的诀窍;我正在尝试使用各种类似 Facebook 的 "Posts" 创建一个 table 视图。对于这个问题,我将参考 "Photo Post" 谁是 XIB,如下所示:

PhotoPostTableViewCell.xib:

class PhotoPostTableViewCell: UITableViewCell {
    @IBOutlet weak var postingUserImageButton: UIButton!
    @IBOutlet weak var postingUserNameButton: UIButton!
    @IBOutlet weak var timeStampLabel: UILabel!
    @IBOutlet weak var primaryImageView: UIImageView!
    @IBOutlet weak var postContentsLabel: UILabel!
    @IBOutlet weak var rippleLikesLabel: UILabel!
    @IBOutlet weak var rippleButton: UIButton!

    @IBOutlet weak var imageViewHeightConstraint: NSLayoutConstraint!
    ...
}

此post需要具有以下内容:

postingUserID 类型 Int 以引用自定义用户 class 至 link 用户图像和用户名(左上角)

photo 类型 UIImage 用于保存 post

的主图像

postTimeStamp 类型 String 以捕获 post 被 posted

的时间

rippleLikes 类型 Int 保存 "likes" 和 post 的数量;这将被初始化为 0

postID 类型 Int 以便可以在别处引用此 post

这个 post 还有一个 可选的 String 名为 postContentLabel

我尝试了各种不同的方法,但似乎总是以错误告终,所以我想我会寻求一些建议。

我的问题如下:

从各自的 table 中定义此 class 和 create/initialize 此 table 视图单元格 class 的最 professional/efficient 方法是什么]查看委托方法

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { ... }

我喜欢 属性 来存储单元格所代表的实体。

class PhotoPostTableViewCell: UITableViewCell {

    // MARK: Outlets

    @IBOutlet weak var postContentLabel: UILabel?
    @IBOutlet weak var postPhotoImageView: UIImageView?
    @IBOutlet weak var postTimestampLabel: UILabel?
    @IBOutlet weak var rippleLikesLabel: UILabel?
    @IBOutlet weak var userImageView: UIImageView?
    @IBOutlet weak var userNameLabel: UILabel?

    // MARK: Properties

    var photoPost: PhotoPost? {
        didSet {
            // configure your outlets here
            // e.g. postContentLabel.text = photoPost?.content
        }
    }
}

您可以将插座配置代码从 cellForItemAtIndexPath 移动到单元格本身,只需设置单元格的 photoPost 属性。

override func viewDidLoad() {

    super.viewDidLoad()

    tableView.register(UINib(nibName: "PhotoPostTableViewCell", bundle: nil), forCellReuseIdentifier: "PhotoPostCell")
}

...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "PhotoPostCell", for: indexPath) as! PhotoPostTableViewCell

    cell.photoPost = photoPosts[indexPath.row]

    return cell
}

您的照片 post class 可能如下所示:

class PhotoPost {

    // MARK: Properties

    var contents: String?
    var id: Int!
    var photo: UIImage!
    var rippleLikes: Int!
    var timestamp: Double!
    var userID: Int!

    init(json: [String: Any]) {

        self.contents = json["contents"] as? String
        self.id = json["id"] as? Int
        self.photo = ...
        self.rippleLikes = json["rippleLikes"] as? Int
        self.timestamp = json["timestamp"] as? Double
        self.userID = json["userID"] as? Int
    }
}