View导航回来时调用viewDidLoad()

时间:2016-12-23 19:48:07

标签: ios iphone swift uicollectionview uicollectionviewcell

当用户在集合视图中选择一个单元格时,它会推送到该单元格的新视图控制器。

问题是当用户向后滑动时,集合视图控制器运行viewDidLoad()而不是viewDidAppear()。这会导致整个集合视图重新加载并返回到顶部(第一个单元格),用户必须一直向下滚动才能到达之前的位置。

有谁知道为什么会这样?

import UIKit
import FirebaseStorage

class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

let reuseIdentifier = "PostCell"

var post: [Post] = [Post]()

var imageURLs: [URL] = [URL]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.hidesBarsOnSwipe = true

    collectionView?.backgroundColor = UIColor(red: 0.91, green: 0.91, blue: 0.91, alpha: 1.00)

    // Uncomment the following line to preserve selection between presentations
    self.clearsSelectionOnViewWillAppear = false

    // Register cell classes
    collectionView?.register(PostCell.self, forCellWithReuseIdentifier: reuseIdentifier)

    //setupHorizontalBar()
    setupCollectionView()

    // Get all of the posts
    loadPosts()

    print("loaded")

}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)
    print("appeared")
    collectionView.index
}

func setupCollectionView() {

    if let layout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.scrollDirection = .vertical
        layout.minimumLineSpacing = 0
    }

}

func loadPosts() {
    postRef.observe(.value, with: { (snapshot) in
        for eachPost in snapshot.value as! [String: Any] {
            let dict: Dictionary<String, Any> = [eachPost.key: eachPost.value]
            let post = Post(postDictionary: dict)
            print(post)
            self.posts.append(post)
            self.collectionView?.reloadData()
        }
    })
}

override func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return posts.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! PostCell
    //cell.backgroundColor = .brown
    let post = posts[indexPath.row]
    cell.nameLabel.text = post.name
    let details = "\n\(post.address!)\n\n\(post.time!) \(post.date!)"
    cell.postDetailTextView.text = details
    if let imageURL = post.image {

        print(imageURL)

        cell.postImageView.sd_setImage(with: URL(string: imageURL))
    }
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let height = (self.view.frame.width - 20) * 9 / 16
    return CGSize(width: self.view.frame.width, height: height + 5 + 140)
}

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

调用didSelectItemAt时,我希望导航控制器推送到所选单元格的另一个视图控制器。

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print(indexPath)
    let detailVC = DetailViewController()
    self.navigationController?.pushViewController(detailVC, animated: true)
}

}

0 个答案:

没有答案