为啥 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” WechatMomentViewControllerUIViewController 扩展而来,我在代码中的任何地方都没有提到 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 中的代码?的主要内容,如果未能解决你的问题,请参考以下文章

为啥func调用中的代码块没有被执行?

Xcode 11. SceneDelegate func willConnectTo。不接受带有属性的函数

为啥 set_exception_handler(func) 不捕获异常?

为啥在使用 XCode 和 xcodebuild 之间存在差异?

为啥我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?

为啥在 Objective-C 中执行 alloc 和 init 在单独的语句中会导致对象根据 Xcode 静态分析器被释放?