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
}
}
为了学习 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
}
}