为啥 Xcode 不执行 func tableView 中的代码?
Posted
技术标签:
【中文标题】为啥 Xcode 不执行 func tableView 中的代码?【英文标题】:why Xcode do not execute the codes in func tableView?为什么 Xcode 不执行 func tableView 中的代码? 【发布时间】:2022-01-18 09:24:33 【问题描述】:问题: 我在tableView的函数里面设置了几个断点。但是 Xcode 没有执行 tableView 中的代码。请告诉我如何解决这些问题。 我是学习 ios 开发的新手,我正在尝试编写 Tweeter 显示页面的演示。期待回复!
这里是扩展 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
这里是所有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
这是WechatMomentListCell的识别码:
import Foundation
import UIKit
class WechatMomentListCell: UITableViewCell
var content = UILabel()
var senderAvatar = UIImageView()
var senderNick = UILabel()
var Images = [UIImageView()]
var comments = [UILabel()]
【问题讨论】:
您是否将数据源分配给表格视图? 不,我使用 snapkit 而不是故事板。我认为应该自动完成..你能告诉我怎么做吗? tableView.delegate = self , tableView.datasource = self 请在 viewDidload 中添加这个 谢谢,我试过并得到一个错误“'datasource' cannot be resolve without a contextual type”WechatMomentViewController
从 UIViewController
扩展而来,我在代码中的任何地方都没有提到 UITableView
【参考方案1】:
你的类应该扩展 UITableViewController 而不是 UIViewController 。您还必须注册您的手机。
class WechatMomentViewController: UITableViewController
let kCellIdentifier = "CellIdentifier"
override func viewDidLoad()
super.viewDidLoad()
self.tableView?.register(WechatMomentListCell, forCellReuseIdentifier: kCellIdentifier)
【讨论】:
谢谢,但我不允许在这个演示中在 Vc 中使用 UITableViewController。这就是为什么我必须遵循 UITableViewDataSource 的协议。 查看 snapKit 示例。希望这会有所帮助.. github.com/SnapKit/SnapKit/blob/develop/Example-iOS/…【参考方案2】:添加类似:
override func viewDidLoad()
super.viewDidLoad()
tableView.delegate = self // if you are...
tableView.datasource = self
...
问题在于你很可能(你没有显示)有一个普通的UIViewController
,而不是UITableViewController
。因此,tableview 没有委托也没有数据源。或者,如果您使用的是故事板或 xib,您可以从 tableview 右键单击到控制器并在那里分配这些值。
【讨论】:
谢谢。但是如果我添加“tableView.datasource = self”,则会出现错误显示“如果没有上下文类型,就无法解析对成员'数据源'的引用” 顺便说一句,我使用的是 snapkit 而不是故事板。 我发现了问题!那是因为我没有tableView的实例,也没有添加到view中。更重要的是,我需要重新加载数据。【参考方案3】:问题是: 首先,我没有 TableView()。所以我创建了一个新的 TableView 实例。 其次,使用
view.addSubivew(tableview)
然后,成员从您的视图模型中重新加载数据。
还有...试试clean build
(真的很有帮助)
【讨论】:
别忘了注册以上是关于为啥 Xcode 不执行 func tableView 中的代码?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 11. SceneDelegate func willConnectTo。不接受带有属性的函数
为啥 set_exception_handler(func) 不捕获异常?
为啥在使用 XCode 和 xcodebuild 之间存在差异?
为啥我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?
为啥在 Objective-C 中执行 alloc 和 init 在单独的语句中会导致对象根据 Xcode 静态分析器被释放?