Использование статических ячеек и динамических прототипов в Swift - PullRequest
0 голосов
/ 10 июня 2019

Я сделал просмотр таблицы статической ячейкой. С тех пор я разделил разделы на два раздела: раздел 1 для статических ячеек, раздел 2 для динамических прототипов. Однако я хочу показать ячейку динамического прототипа в табличном представлении, чтобы раздел 1 не отображался.

Раздел 1 (статическая ячейка) хорош. Обратите внимание, что это приложение отображает информацию о фильме, используя фильм API. В разделе 1 используются статические ячейки для представления подробностей фильма, а в разделе 2 используются динамические ячейки прототипов для выставления оценок пользователей. Детали фильма хорошо известны, но добавление динамического прототипа не удалось.

import UIKit

class MovieDetailViewController: UITableViewController {

    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var titleImage: UIImageView!
    @IBOutlet weak var gradeImage: UIImageView!
    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var genreLabel: UILabel!
    @IBOutlet weak var durationLabel: UILabel!
    @IBOutlet weak var reservationRateLabel: UILabel!
    @IBOutlet weak var userRatingLabel: UILabel!
    @IBOutlet weak var audienceLabel: UILabel!
    @IBOutlet weak var sysnopsisTextView: UITextView!
    @IBOutlet weak var directorLabel: UILabel!
    @IBOutlet weak var actorLabel: UILabel!
    @IBOutlet weak var commentTableView: UITableView!

    var movieId: String?
    var movieDetail: MovieDetail?
    var movieCommentList: CommentList?

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(UINib(nibName: "CommentsCell", bundle: nil), forCellReuseIdentifier: "CommentsCell")

        MovieAPI.requestId(id: movieId ?? "") { (movieDetail, error) in

            self.movieDetail = movieDetail

            DispatchQueue.main.async {
                self.navigationController?.navigationBar.topItem?.title = "\(movieDetail?.title ?? "")"
                self.titleLabel.text = movieDetail?.title
                self.genreLabel.text = movieDetail?.genre
                self.dateLabel.text = movieDetail?.date
                self.durationLabel.text = ",\(movieDetail?.duration ?? 0)분"
                self.reservationRateLabel.text = "\(movieDetail?.reservationRate ?? 0)"
                self.userRatingLabel.text = "\(movieDetail?.userRating ?? 0)"
                self.audienceLabel.text = "\(movieDetail?.audience ?? 0)"
                self.sysnopsisTextView.text = movieDetail?.synopsis
                self.directorLabel.text = movieDetail?.director
                self.actorLabel.text = movieDetail?.actor
                self.gradeImage.image = UIImage(named: "\(movieDetail?.grade ?? 0)")
                self.handleImageResponse()
            }
        }

        MovieAPI.requestComments(id: movieId ?? "") { (movieComments, error) in


        }
    }

    func handleImageResponse() {
        guard let imageURL = URL(string: movieDetail?.image ?? "") else {
            return
        }

        MovieAPI.requestImageFile(url: imageURL, completionHandler: handleImageFileResponse(image:error:))
    }

    func handleImageFileResponse(image: UIImage?, error: Error?) {
        DispatchQueue.main.async {

            self.titleImage.image = image
        }
    }
}

//Dynamic prototype try!! -> failed
extension MovieDetailViewController {

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if section == 1 {
            return movieCommentList?.comments.count ?? 0
        }
        return super.tableView(tableView, numberOfRowsInSection: section)
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellId = "CommentsCell"
        let cell = self.commentTableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! CommentsCell

        cell.commentsView.text = movieCommentList?.comments[indexPath.row].contents

        return cell
    }
}

Направление, которое я хочу, - это иметь секцию 1 (статическая ячейка) и секцию 2 (динамические прототипы) по порядку.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Ваш вопрос не объяснен должным образом и в основном потому, что вы используете плохие методы кодирования. Я предлагаю создать объект «dataSource», который будет содержать ваши разделы.

Например:

struct SectionItem {
   var header: String?
   var item: RowItem // where RowItem can be a protocol that your comment any object can be (Like the string from the contents property of your comment object)
}

И из этого вы можете сделать массив разделов. Как это вам не нужно:

    if section == 1 {
        return movieCommentList?.comments.count ?? 0
    }
    return super.tableView(tableView, numberOfRowsInSection: section)

Но

return sections[indexPath.section].items.count

И

override func numberOfSections(in tableView: UITableView) -> Int {
    return return sections.count
}

Таким образом:

  • вы избегаете жестко закодированных значений, которые гораздо сложнее отлаживать чем вы представляете, если ваш проект становится большим
  • Вы можете легко изменить элемент на любой другой, используя простой полиморфизм
  • Ваш список автоматически скроет или покажет нужные разделы, его будет легко понять, а также объяснить, что вы не можете с помощью текущего кода.
0 голосов
/ 10 июня 2019

На мой взгляд, реализация по умолчанию для numberOfRowsInSection () вернула бы 0 строк.Вы также должны указать количество строк для раздела 2.

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 1 {
        return movieCommentList?.comments.count ?? 0
    } 
    //Return number as per your requirement for section 2 
    return 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...