gpt4 book ai didi

ios - 快速重新加载 Collection View 不起作用

转载 作者:行者123 更新时间:2023-11-29 00:02:31 25 4
gpt4 key购买 nike

我是 swift 的新手。我按照一些教程开发社交应用程序,如 Twitter 应用程序以遵循 tutorial .我开始实现跟随按钮功能。它调用另一个 API 调用,但相同的响应带有较小的修改(例如 - 追随者属性的数量增加一个)。通话也能正常工作。但 Collection View 没有重新加载。我的代码是。

View Controller

import LBTAComponents
import TRON
import SwiftyJSON

class HomeDatasourceController: DatasourceController {

let errorMessageLabel: UILabel = {
let label = UILabel()
label.text = "Apologies something went wrong. Please try again later..."
label.textAlignment = .center
label.numberOfLines = 0
label.isHidden = true
return label
}()

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
collectionViewLayout.invalidateLayout()
}

func follow(){
print("inside controller")
Service.sharedInstance.fetchfollowHomeFeed { (homeDatasource, err) in
if let err = err {
self.errorMessageLabel.isHidden = false

if let apiError = err as? APIError<Service.JSONError> {

if apiError.response?.statusCode != 200 {
self.errorMessageLabel.text = "Status code was not 200"
}
}

return
}
self.datasource = homeDatasource
self.collectionView?.reloadData()
}
}

override func viewDidLoad() {
super.viewDidLoad()

view.addSubview(errorMessageLabel)
errorMessageLabel.fillSuperview() //LBTA method call

collectionView?.backgroundColor = UIColor(r: 232, g: 236, b: 241)

setupNavigationBarItems()

Service.sharedInstance.fetchHomeFeed { (homeDatasource, err) in
if let err = err {
self.errorMessageLabel.isHidden = false

if let apiError = err as? APIError<Service.JSONError> {

if apiError.response?.statusCode != 200 {
self.errorMessageLabel.text = "Status code was not 200"
}
}

return
}

self.datasource = homeDatasource
}
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}

override func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

//first section of users
if indexPath.section == 0 {
guard let user = self.datasource?.item(indexPath) as? User else { return .zero }

let estimatedHeight = estimatedHeightForText(user.bioText)
return CGSize(width: view.frame.width, height: estimatedHeight + 66)
} else if indexPath.section == 1 {
//our tweets size estimation

guard let tweet = datasource?.item(indexPath) as? Tweet else { return .zero }

let estimatedHeight = estimatedHeightForText(tweet.message)

return CGSize(width: view.frame.width, height: estimatedHeight + 74)
}


return CGSize(width: view.frame.width, height: 200)
}

private func estimatedHeightForText(_ text: String) -> CGFloat {
let approximateWidthOfBioTextView = view.frame.width - 12 - 50 - 12 - 2
let size = CGSize(width: approximateWidthOfBioTextView, height: 1000)
let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 15)]

let estimatedFrame = NSString(string: text).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attributes, context: nil)

return estimatedFrame.height
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
if section == 1 {
return .zero
}
return CGSize(width: view.frame.width, height: 50)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
if section == 1 {
return .zero
}
return CGSize(width: view.frame.width, height: 64)
}

}

数据源

import LBTAComponents
import TRON
import SwiftyJSON

extension Collection where Iterator.Element == JSON {
func decode<T: JSONDecodable>() throws -> [T] {
return try map{try T(json: $0)}
}
}

class HomeDatasource: Datasource, JSONDecodable {

let users: [User]

required init(json: JSON) throws {
guard let usersJsonArray = json["users"].array, let tweetsJsonArray = json["tweets"].array else {
throw NSError(domain: "com.letsbuildthatapp", code: 1, userInfo: [NSLocalizedDescriptionKey: "Parsing JSON was not valid."])
}

// self.users = usersJsonArray.map{User(json: $0)}
// self.tweets = tweetsJsonArray.map{Tweet(json: $0)}

self.users = try usersJsonArray.decode()
self.tweets = try tweetsJsonArray.decode()

}

let tweets: [Tweet]

override func footerClasses() -> [DatasourceCell.Type]? {
return [UserFooter.self]
}

override func headerClasses() -> [DatasourceCell.Type]? {
return [UserHeader.self]
}

override func cellClasses() -> [DatasourceCell.Type] {
return [UserCell.self, TweetCell.self]
}

override func item(_ indexPath: IndexPath) -> Any? {
if indexPath.section == 1 {
return tweets[indexPath.item]
}
return users[indexPath.item]
}

override func numberOfSections() -> Int {
return 2
}

override func numberOfItems(_ section: Int) -> Int {
if section == 1 {
return tweets.count
}
return users.count
}

}

数据单元格

import LBTAComponents

class UserCell: DatasourceCell {

override var datasourceItem: Any? {
didSet {
guard let user = datasourceItem as? User else { return }
followButton.addTarget(self, action: #selector(follow), for: .touchUpInside)
nameLabel.text = user.name
usernameLabel.text = user.username
bioTextView.text = user.bioText

profileImageView.loadImage(urlString: user.profileImageUrl)
}
}

let profileImageView: CachedImageView = {
let imageView = CachedImageView()
imageView.image = #imageLiteral(resourceName: "profile_image")
imageView.layer.cornerRadius = 5
imageView.clipsToBounds = true
return imageView
}()

let nameLabel: UILabel = {
let label = UILabel()
label.text = "Brian Voong"
label.font = UIFont.boldSystemFont(ofSize: 16)
return label
}()

let usernameLabel: UILabel = {
let label = UILabel()
label.text = "@buildthatapp"
label.font = UIFont.systemFont(ofSize: 14)
label.textColor = UIColor(r: 130, g: 130, b: 130)
return label
}()

let bioTextView: UITextView = {
let textView = UITextView()
textView.text = "iPhone, iPad, iOS Programming Community. Join us to learn Swift, Objective-C and build iOS apps!"
textView.font = UIFont.systemFont(ofSize: 15)
textView.backgroundColor = .clear
return textView
}()

let followButton: UIButton = {
let button = UIButton()
button.layer.cornerRadius = 5
button.layer.borderColor = twitterBlue.cgColor
button.layer.borderWidth = 1
button.setTitle("Follow", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
button.setTitleColor(twitterBlue, for: .normal)
button.setImage(#imageLiteral(resourceName: "follow"), for: .normal)
button.imageView?.contentMode = .scaleAspectFit
button.imageEdgeInsets = UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
// button.titleEdgeInsets = UIEdgeInsets
return button
}()
func follow(){
print("inside source")
var link = HomeDatasourceController()
link.follow()
}
override func setupViews() {
super.setupViews()

backgroundColor = .white

separatorLineView.isHidden = false
separatorLineView.backgroundColor = UIColor(r: 230, g: 230, b: 230)

addSubview(profileImageView)
addSubview(nameLabel)
addSubview(usernameLabel)
addSubview(bioTextView)
addSubview(followButton)

profileImageView.anchor(self.topAnchor, left: self.leftAnchor, bottom: nil, right: nil, topConstant: 12, leftConstant: 12, bottomConstant: 0, rightConstant: 0, widthConstant: 50, heightConstant: 50)

nameLabel.anchor(profileImageView.topAnchor, left: profileImageView.rightAnchor, bottom: nil, right: followButton.leftAnchor, topConstant: 0, leftConstant: 8, bottomConstant: 0, rightConstant: 12, widthConstant: 0, heightConstant: 20)

usernameLabel.anchor(nameLabel.bottomAnchor, left: nameLabel.leftAnchor, bottom: nil, right: nameLabel.rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 20)

bioTextView.anchor(usernameLabel.bottomAnchor, left: usernameLabel.leftAnchor, bottom: self.bottomAnchor, right: self.rightAnchor, topConstant: -4, leftConstant: -4, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 0)

followButton.anchor(topAnchor, left: nil, bottom: nil, right: self.rightAnchor, topConstant: 12, leftConstant: 0, bottomConstant: 0, rightConstant: 12, widthConstant: 120, heightConstant: 34)
}
}

它使用 LBTA components .i 试过 self.collectionView?.reloadData() 但它没有重新加载。请帮我解决这个问题。下载我的完整源代码 here请帮助我

最佳答案

我看过你的项目并发现了你做的问题。在 UserCell.swift 类中,您应该使用下一个代码:

func follow(){
print("inside source")
guard let link = controller as? HomeDatasourceController else { return }
link.follow()
}

解释问题

这是您项目中的代码

func follow(){
print("inside source")
var link = HomeDatasourceController() // in this place you create a new local instance of class 'HomeDatasourceController'
link.follow()
}

关于ios - 快速重新加载 Collection View 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49074638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com