Как показать контроллер представления при выборе ячейки строки tableView (как ячейка представления коллекции)? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть главный контроллер представления, который имеет представление коллекции со своими ячейками представления коллекции, каждая из которых инициализирована как табличное представление для обслуживания нескольких строк внутри этой ячейки представления коллекции. Если вы запутались, ниже приведен снимок текущего состояния.

Проблема заключается в том, что я пытаюсь коснуться ячейки строки tableView, чтобы открыть другое представлениеконтроллер, он не работает, и отображается выбранное состояние ячейки табличного представления.

Вот снимок.

//HomeCollectionViewCell.swift
class HomeCollectionViewCell: UICollectionViewCell {
override func layoutSubviews() {
    super.layoutSubviews()
    setUpCellView()
}
func setUpCellView() {
    let frame = CGRect(x:20, y:20, width: bounds.width - 40, height: 600)
    let cell = CellView(frame: frame)
    contentView.addSubview(cell)
  }
}

//CellView.swift
class CellView: UITableView {
    let quoteCell = "QuoteCell"
    let newsCell = "NewsCell"
    let articleCell = "ArticleCell"
    override init(frame: CGRect, style: UITableViewStyle) {
        super.init(frame: frame, style: .grouped)
        self.layer.cornerRadius = 15
        self.backgroundColor = .white
        self.dataSource = self
        self.delegate = self
        self.register(QuoteTableViewCell.self, forCellReuseIdentifier: quoteCell)
        self.register(NewsTableViewCell.self, forCellReuseIdentifier: newsCell)
        self.register(ArticleTableViewCell.self, forCellReuseIdentifier: articleCell)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
extension CellView: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    switch indexPath.section {
        case 0: return 35
        case 1: return 140
        case 2: return 100
        case 3: return 140
        default: return 0
    }
  }
}
extension CellView: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
    return categories.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return categories[section]
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.section {
        case 0: let cell = tableView.dequeueReusableCell(withIdentifier: dateCell)
                cell?.textLabel?.text = "Today"
                cell?.textLabel?.font = UIFont.systemFont(ofSize: 30, weight: UIFont.Weight.heavy)

        return cell!
        case 1: let cell = tableView.dequeueReusableCell(withIdentifier: quoteCell) as! QuoteTableViewCell
        return cell
        case 2: let cell = tableView.dequeueReusableCell(withIdentifier: newsCell) as! NewsTableViewCell
        return cell
        case 3: let cell = tableView.dequeueReusableCell(withIdentifier: articleCell) as! ArticleTableViewCell
        return cell
        default: let cell = tableView.dequeueReusableCell(withIdentifier: commonCell)
        cell?.textLabel?.text = "LOL"
        return cell!
    }
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch indexPath.section {
    case 0: print("Date Selected")
    case 1: print("Quote Selected")
    case 2: print("News Selected")
    case 3: let homeViewController = HomeViewController()
            let articleDetailViewController = ArticleDetailViewController()
//homeViewController.show(articleDetailViewController, sender: homeViewController)//homeViewController.navigationController?.pushViewController(articleDetailViewController, animated: true)
    homeViewController.present(articleDetailViewController, animated: true, completion: nil)
            print("Article selected")
    default: print("LOL")
    }
  }   
}

//HomeViewController.swift

class HomeViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    setupNavBar()
    view.addSubview(collectionView)
    setUpConstraints()
    configure(collectionView: collectionView)
}
func setUpConstraints() {
    _ = collectionView.anchor(view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, topConstant: 10, leftConstant: 10, bottomConstant: 10, rightConstant: 10, widthConstant: 0, heightConstant: 0)
    collectionView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
}

lazy var collectionView : UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical
    let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
    cv.translatesAutoresizingMaskIntoConstraints = false
    cv.alwaysBounceVertical = true
    cv.clipsToBounds = true
    cv.showsHorizontalScrollIndicator = false
    cv.showsVerticalScrollIndicator = false
    cv.backgroundColor = .clear
    cv.isHidden = false
    return cv
}()
}
private let reuseIdentifier = "Cell"
extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
internal func configure(collectionView: UICollectionView) {
    collectionView.register(HomeCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    collectionView.dataSource = self
    collectionView.delegate = self
    collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 20, right: 0)
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 7
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! HomeCollectionViewCell
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.bounds.width, height: 600)
}
}

Скажите, пожалуйста, где я делаю неправильно или какой подход мне использовать?

Примечание. Не используйте раскадровки / IB.Выполнено только программно.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Из того, что вы сделали, я хочу отметить, что не стоит представлять UIViewController из UView. Вы должны написать несколько пользовательских делегатов, которые будут уволены, когда кто-то нажмет на эти ячейки в пользовательском классе CellView. Эти делегаты должны быть реализованы в контроллере представления, который содержит представление таблицы. От UIViewController вы должны написать код для представления новых контроллеров представления.

0 голосов
/ 11 сентября 2018

Дайте идентификаторы (" HomeViewController " и " ArticleDetailViewController ") для просмотра контроллеров и попробуйте следующий код в didSelectRow () .

case 3:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let sourceViewController = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as? HomeViewController
let destinationViewController = storyboard.instantiateViewController(withIdentifier: "ArticleDetailViewController") as? ArticleDetailViewController
let navigator: UINavigationController = sourceViewController as! UINavigationController                                                                                                                                                       
navigator.pushViewController(destinationViewController!, animated: true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...