question:
I set several breakpoints inside the function of tableView. However the Xcode didn’t execute the code inside the tableView. please tell me how to fix these.
I’m new to learn about IOS development and I’m trying to write a demo of Tweeter show page. Looking forward for responses!
Here is code of extension UITablewViewDataSource:
extension WechatMomentViewController: UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.tweetList?.count ?? 0;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let tweetCell = tableView.dequeueReusableCell(withIdentifier: "WechatMomentListCell", for: indexPath) as? WechatMomentListCell else {
fatalError("there is no WechatMomentList")
}
let tweet = viewModel.tweetList?[indexPath.row]
for i in tweet?.images ?? [] {
let flagImage = UIImageView()
flagImage.sd_setImage(with: URL(string: i.url))
tweetCell.Images.append(flagImage)
}
for i in tweet?.comments ?? [] {
let flagComment = UILabel()
flagComment.text = "(i.sender) : (i.content)"
tweetCell.comments.append(flagComment)
}
tweetCell.senderNick.text = tweet?.sender?.nick
tweetCell.senderAvatar.sd_setImage(with: URL(string: tweet?.sender?.avatar ?? ""), placeholderImage: UIImage(named: "placeholder.png"))
tweetCell.content.text = tweet?.content
return tweetCell
}
}
and here is the code of all ViewController:
import UIKit
import SnapKit
import SDWebImage
import Alamofire
//
class WechatMomentViewController: UIViewController {
let viewModel = WechatMomentViewModel()
var userAvatar = UIImageView()
var userProfileImage = UIImageView()
var userNick = UIButton()
var TweetCell = UITableViewCell()
override func viewDidLoad() {
super.viewDidLoad()
viewModel.delegate = self
getUserProfile()
getTweet()
}
fileprivate func getUserProfile() {
viewModel.getUserProfile()
view.addSubview(userProfileImage)
userAvatar.backgroundColor = UIColor.black
view.addSubview(userAvatar)
userAvatar.snp.makeConstraints{ (make) in
make.height.equalTo(80)
make.width.equalTo(80)
make.right.equalToSuperview().offset(-10)
make.centerY.equalToSuperview()
}
userAvatar.clipsToBounds = true;
userAvatar.layer.cornerRadius = 10;
view.addSubview(userNick)
userNick.snp.makeConstraints{ (make) in
make.width.equalTo(90)
make.height.equalTo(20)
make.trailing.equalTo(userAvatar.snp.leading)
make.centerY.equalTo(userAvatar)
}
userProfileImage.frame = CGRect(x: 0, y: 0, width: 414, height: 448)
}
fileprivate func getTweet() {
viewModel.getTweet()
}
}
extension WechatMomentViewController: WechatMomentVCProtocol {
func refreshUI() {
if let user = viewModel.user,
let avatar = user.avatar,
let profileImage = user.profileImage {
userAvatar.sd_setImage(with: URL(string: avatar))
userProfileImage.sd_setImage(with: URL(string: profileImage))
userNick.setTitle(user.nick, for: .normal)
}
}
}
extension WechatMomentViewController: UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.tweetList?.count ?? 0;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let tweetCell = tableView.dequeueReusableCell(withIdentifier: "WechatMomentListCell", for: indexPath) as? WechatMomentListCell else {
fatalError("there is no WechatMomentList")
}
let tweet = viewModel.tweetList?[indexPath.row]
for i in tweet?.images ?? [] {
let flagImage = UIImageView()
flagImage.sd_setImage(with: URL(string: i.url))
tweetCell.Images.append(flagImage)
}
for i in tweet?.comments ?? [] {
let flagComment = UILabel()
flagComment.text = "(i.sender) : (i.content)"
tweetCell.comments.append(flagComment)
}
tweetCell.senderNick.text = tweet?.sender?.nick
tweetCell.senderAvatar.sd_setImage(with: URL(string: tweet?.sender?.avatar ?? ""), placeholderImage: UIImage(named: "placeholder.png"))
tweetCell.content.text = tweet?.content
return tweetCell
}
}
and here is identifire code of WechatMomentListCell:
import Foundation
import UIKit
class WechatMomentListCell: UITableViewCell{
var content = UILabel()
var senderAvatar = UIImageView()
var senderNick = UILabel()
var Images = [UIImageView()]
var comments = [UILabel()]
}
3
Answers
The problem is: firstly, I don't have TableView(). So I create a new instance of TableView. Secondly, use
Then, member to reloadData from your View Model.
and... try
clean build
(it is really helpful)Add something like:
The problem ist that you will most likely (you didn’t show) have a regular
UIViewController
and not aUITableViewController
. Therefore the tableview does not have a delegate nor a datasource. Alternatively, if you are using a storyboard or a xib, you can right click from the tableview to the controller and assign those values there.your class should extend UITableViewController not UIViewController . Also you must register you cell.