私はUITableView
を持ち、プロトタイプセルにはUICollectionView
を持っています。各セルにCollectionViewを持つUITableViewで再利用可能なセルを使用していません
MainViewController
はUITableView
と MyTableViewCell
クラスの委譲であるUICollectionView
のために委任しています。
各TableViewCell
の内容を更新すると、cell.reloadData()
が呼び出され、セル内のcollectionViewの内容がリロードされます。
再利用可能なセルを使用すると、各セルが表示されると、最後のセルの内容が消えてしまいます。次に、URLから正しい内容をロードします。
私は最大で5から10までです。UITableViewCells
です。だから私はUITableView
のために再利用可能な細胞を使わないことにしました。 は、私がこれまでのtableView方法における細胞の作成ラインを変更:
let cell = MyTableViewCell(style: .default, reuseIdentifier:nil)
それから私は、この機能では、(UICollectionViewのための委任である)MyTableViewCellクラスのエラーを得た:
override func layoutSubviews() {
myCollectionView.dataSource = self
}
EXC_BAD_INSTRUCTION CODE(code=EXC_I386_INVOP, subcode=0x0)
fatal error: unexpectedly found nil while unwrapping an Optional value
MyTableViewCell.swift
import UIKit
import Kingfisher
import Alamofire
class MyTableViewCell: UITableViewCell, UICollectionViewDataSource {
struct const {
struct api_url {
static let category_index = "http://example.com/api/get_category_index/";
static let category_posts = "http://example.com/api/get_category_posts/?category_id=";
}
}
@IBOutlet weak var categoryCollectionView: UICollectionView!
var category : IKCategory?
var posts : [IKPost] = []
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
if category != nil {
self.updateData()
}
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
override func layoutSubviews() {
categoryCollectionView.dataSource = self
}
func updateData() {
if let id = category?.id! {
let url = const.api_url.category_posts + "\(id)"
Alamofire.request(url).responseObject { (response: DataResponse<IKPostResponse>) in
if let postResponse = response.result.value {
if let posts = postResponse.posts {
self.posts = posts
self.categoryCollectionView.reloadData()
}
}
}
}
}
internal func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath as IndexPath) as! MyCollectionViewCell
let post = self.posts[indexPath.item]
cell.postThumb.kf.setImage(with: URL(string: post.thumbnail!))
cell.postTitle.text = post.title
return cell
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//You would get something like "model.count" here. It would depend on your data source
return self.posts.count
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
}
MainViewController.swift
細胞を再利用しないのはなぜMyCollectionViewCell.swift
import UIKit
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var postThumb: UIImageView!
@IBOutlet weak var postTitle: UILabel!
var category : IKCategory?
}
はこれを引き起こしましたか?なぜ私は間違っているのですか?
再利用可能なセルを使用しても問題はありません。次のセルが表示されてから古いデータが表示されないようにするには、データソースを消去するだけです。テーブルセルのコードをすべて投稿してください。問題のトラブルシューティングが簡単になります。 layoutSubviews()はおそらくデータソースを設定する場所ではありません – BJHStudios
@BJHStudiosはソースコード – Hadu