Tableview продолжает возвращаться к началу? После выхода на «подробный» вк? - PullRequest
0 голосов
/ 06 октября 2019

Как я могу предотвратить запуск контроллера представления с верхней части канала, когда пользователь уходит и возвращается назад?

По сути, у меня есть основной ВК и подробный ВК. Когда пользователь выбирает ячейку, он должен перейти к подробному VC. Если он / он возвращается, он должен оставить ее там, где она / он был.

Я получаю, что мой код вызывает «перезагрузку данных» каждый раз при загрузке VC, но какие другие варианты у меня тогдаесли я не вызову этот метод?

Вот изображение моей основной раскадровки, если это поможет. Основной ВК (слева) - это таблица подачи, где пользователь может нажать на ячейку. Когда он / она стучит по ячейке, она «переходит» к таблице комментариев VC (справа). Когда он / она закончит комментировать, она / он может вернуться к главному венчурному капиталу и продолжить спуск по каналу. (в идеале, за исключением того, что он продолжает загружаться из новейшего сообщения, а не возвращать пользователя туда, где он / она находился в ленте)

[введите описание изображения здесь] [1]

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostCell

        let post: PostModel


        post = postList[indexPath.row]

        func set(post: PostModel) {
            ImageService.downloadImage(withURL: post.author.patthToImage) { image in
                cell.profileImage.image = image
            }
        }
        set(post: postList[indexPath.row])
        cell.descriptionLabel.numberOfLines = 0 // line wrap
        cell.descriptionLabel.lineBreakMode = NSLineBreakMode.byWordWrapping

        cell.descriptionLabel.text = post.message

        cell.authorLabel.text = post.author.username

        cell.timeLabel.text = post.createdAt.calendarTimeSinceNow()

        //takes care of post image hidding and showing
        if self.postList[indexPath.row].pathToImage != "" {
            cell.postImage.isHidden = false
            cell.postImage?.downloadImage(from: self.postList[indexPath.row].pathToImage)

        } else {
            cell.postImage.isHidden = true

        }

        if cell.postImage.isHidden == true {
            cell.postImage.frame = CGRect(x: 0, y: 0, width: 0, height: 0)

        }

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let post: PostModel

        post = postList[indexPath.row]
        myIndex = indexPath.row
        myPost = post.postID!
        performSegue(withIdentifier: "segue", sender: self)
        print(myIndex)
        print(post.postID)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        beginBatchFetch()

    }

    func beginBatchFetch() {
        fetchingMore = true

        fetchPosts { newPosts in
            self.postList.append(contentsOf: newPosts)

            self.endReached = newPosts.count == 0
            self.fetchingMore = false
            self.tableViewPost.reloadData()

        }

    }
    func fetchPosts(completion: @escaping(_ postList:[PostModel])->()) {
        ref = Database.database().reference().child("posts")
        var queryRef:DatabaseQuery
        let lastPost = self.postList.last

        if lastPost != nil {
            let lastTimestamp = lastPost!.createdAt.timeIntervalSince1970 * 1000
            queryRef = ref.queryOrdered(byChild: "timestamp").queryEnding(atValue: lastTimestamp).queryLimited(toLast:20)
        } else {
            queryRef = ref.queryOrdered(byChild: "timestamp").queryLimited(toLast:20)
        }

        queryRef.observeSingleEvent(of: .value, with: { snapshot in

            var tempPosts = [PostModel]()


            for child in snapshot.children {
                if let childSnapshot = child as? DataSnapshot,
                    let dict = childSnapshot.value as? [String:Any],
                    let author = dict["author"] as? [String:Any],
                    let uid = author["uid"] as? String,
                    let username = author["username"] as? String,
                    let fullname = author["fullname"] as? String,
                    let patthToImage = author["patthToImage"] as? String,
                    let url = URL(string:patthToImage),

                    let pathToImage = dict["pathToImage"] as? String,
                    let likes = dict["likes"] as? Int,
                    let postID = dict["postID"] as? String,
                    let message = dict["message"] as? String,
                    let genre = dict["genre"] as? String,
                    let timestamp = dict["timestamp"] as? Double {


                    let userProfile = UserProfile(uid: uid, fullname: fullname, username: username, patthToImage: url)
                    let post = PostModel(genre: genre, likes: likes, message: message, pathToImage: pathToImage, postID: postID, userID: pathToImage, timestamp: timestamp, id: childSnapshot.key, author: userProfile)
                    tempPosts.insert(post, at: 0)
                }
            }

            //first two
            self.postList = tempPosts
            self.tableViewPost.reloadData()
//            return completion(tempPosts)
        })


  [1]: https://i.stack.imgur.com/CxFPK.png

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

"Я добавил кнопку" назад ", чтобы перейти назад" Это проблема. Чтобы вернуться назад, нужно позвонить dismiss - не использовать второй переход (если только это не особый переход с "раскруткой", но вы не знаете, как это сделать).

0 голосов
/ 06 октября 2019

Проблема, как указал Мэтт, заключается в том, что вы переходите к detailVC, а затем возвращаетесь к исходному VC. Это создает новый экземпляр исходного VC.

Что вы должны сделать в вашем VC с табличным представлением, это создать экземпляр и представить контроллер представления назначения, когда выбрана ячейка. Поэтому вы должны заменить performSegue(withIdentifier: "segue", sender: self) на что-то вроде:

let storyboard = UIStoryboard(name: "Main", bundle: .main)
var destinationVC = (storyboard.instantiateViewController(withIdentifier: "DestinationVC") as! DestinationViewController)
present(destinationVC!, animated: ture, completion: nil)

ПРИМЕЧАНИЕ: Идентификаторы раскадровки View Controller могут быть установлены в конструкторе интерфейса. Итак, если вы хотите использовать эту строку: var destinationVC = (storyboard.instantiateViewController(withIdentifier: "DestinationVC") as! DestinationViewController), вам сначала нужно будет установить Storyboard ID в конструкторе интерфейса:

enter image description here

Теперь, в вашем контроллере представления назначения, вместо того, чтобы переходить при нажатии на кнопку «Готово», вы хотите использовать метод dismiss для отклонения представленного контроллера представления.

class DestinationViewController: UIViewController {
    @IBAction func backButtonPressed(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }
}

Теперь, оригинальный VC стабличное представление остается в памяти, в то время как целевой VC представлен по нему. Когда пользователь нажимает кнопку «назад», он отклоняет целевой VC, и первоначальный VC должен появиться снова, как только вы его покинули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...