Как перейти к другому контроллеру представления из класса источника данных - PullRequest
0 голосов
/ 09 октября 2019

У меня есть UIViewController с UITableView. У меня есть отдельный класс для UITableViewDataSource и UITableViewDelegate. Как я могу перейти к другому контроллеру представления, когда выбрана ячейка?

class ViewController: UIViewController {

    let tableView = UITableView()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = TableViewDataSource()
    }
}

class TableViewDataSource: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //How to push SecondVC from Viewcontroller?
    }
}

Ответы [ 3 ]

0 голосов
/ 09 октября 2019
class TableViewDataSource: UITableViewDataSource, UITableViewDelegate {

var parentViewController : UIViewController?

func init(parentController : UIViewController){
 self.parentViewController = parentController
}
// rest of your code 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //How to push SecondVC from Viewcontroller?
    let storyboard = UIStoryboard(name: "Stroybaordname", bundle: nil)
        let secondVC = storyboard.instantiateViewController(withIdentifier: "ViewControllerName")
parentViewController.present(secondVC, animated: true, completion: nil)
}

}

Попробуйте вот так

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

Если бы мне пришлось это сделать, я бы сделал это с помощью отдельного метода делегата. Если мне не хватает контекста, простите меня.

class ViewController: UIViewController, TableViewDataSourceDelegate {
  let tableView = UITableView()

  override func viewDidLoad() {
    super.viewDidLoad()
    let customTableDataSource = TableViewDataSource()
    customTableDataSource.delegate = self

    // Setting the custom delegate 
    tableView.delegate = customTableDataSource
  }

  func cellSelected(at: IndexPath) {
    // Navigate from here.
  }
}

/// Protocol helps to communicate with the TableViewDataSource to the user of it.
protocol TableViewDataSourceDelegate {
  func cellSelected(at: IndexPath)
}

class TableViewDataSource: UITableViewDataSource, UITableViewDelegate {
  var delegate: TableViewDataSourceDelegate?
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 0
  }
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      return UITableViewCell()
  }
  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      delegate?.cellSelected(at: indexPath)
  }
}
0 голосов
/ 09 октября 2019

Вы можете создать блоки для доступа к нему в вашем классе ViewController.

//MARK:- MODULES
import UIKit

//MARK:- TYPEALIAS
typealias  ListCellConfigureBlock = (_ cell : AnyObject? , _ item : AnyObject? , _ indexpath: IndexPath?) -> ()
typealias  DidSelectedRow = (_ indexPath : IndexPath) -> ()
typealias  ScrollViewDidScroll = (_ scrollView : UIScrollView) -> ()
typealias ViewForHeaderInSection = (_ section : Int) -> UIView?
typealias  DidDeselectedRow = (_ indexPath : IndexPath) -> ()
typealias CanEditRowAt = (_ indexPath : IndexPath) -> Bool
typealias  CommitEditingStyle = (_ commiteditingStyle: UITableViewCellEditingStyle, _ indexPath : IndexPath) -> ()
typealias HeightForRowAt = (_ indexPath : IndexPath) -> CGFloat

//MARK:- CLASS
class TableViewDataSource: NSObject  {

   //MARK:- PROPERTIES
   var _section: [String]?
   var sectionCount: Array<AnyObject>?
   var rowCount : Array<AnyObject>?
   var cellIdentifier : String?
   var tableView  : UITableView?

   var configureCellBlock : ListCellConfigureBlock?
   var aRowSelectedListener : DidSelectedRow?
   var ScrollViewListener : ScrollViewDidScroll?
   var viewforHeaderInSection : ViewForHeaderInSection?
   var headerHeight : CGFloat?
   var aRowDeselectedListener : DidDeselectedRow?
   var aRowEditListener : CanEditRowAt?
   var aRowCommitListener : CommitEditingStyle?
   var aRowHeightListener : HeightForRowAt?

   init (tableView : UITableView?, cellIdentifier : String?,  sectionCount: Array<AnyObject>?, rowCount : Array<AnyObject>? , height : HeightForRowAt? ,  configureCellBlock : ListCellConfigureBlock? , aRowSelectedListener : @escaping DidSelectedRow,aRowDeselectedListener: @escaping DidDeselectedRow ,aRowCommitListener: @escaping CommitEditingStyle, DidScrollListener : ScrollViewDidScroll?) {

        self.tableView = tableView
        self.sectionCount = sectionCount
        self.rowCount = rowCount
        self.cellIdentifier = cellIdentifier
        self.aRowHeightListener = height
        self.configureCellBlock = configureCellBlock
        self.aRowSelectedListener = aRowSelectedListener
        self.aRowDeselectedListener = aRowDeselectedListener
        self.aRowCommitListener = aRowCommitListener
        self.ScrollViewListener = DidScrollListener
   }

   override init() {
        super.init()
   }
}

//MARK:- DELEGATE, DATASOURCE
extension TableViewDataSource : UITableViewDelegate , UITableViewDataSource{

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let identifier = cellIdentifier else { fatalError("Cell identifier not provided") }
    let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: identifier , for: indexPath) as UITableViewCell
    cell.selectionStyle = UITableViewCellSelectionStyle.none
    if let block = self.configureCellBlock , let item: AnyObject = self.rowCount?[(indexPath as NSIndexPath).row]{
        block(cell , item , indexPath as IndexPath?)
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let block = self.aRowSelectedListener{
        block(indexPath)
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.rowCount?.count ?? 0
}

func numberOfSections(in tableView: UITableView) -> Int {
    return self.sectionCount?.count ?? 0
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    guard let block = self.aRowHeightListener else { return 0.0 }
    return block(indexPath)
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    guard let block = viewforHeaderInSection else { return nil }
    return block(section)
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self._section?[section]
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return headerHeight ?? 0.0
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if let block = self.ScrollViewListener{
        block(scrollView)
    }
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if let block = self.aRowDeselectedListener {
        block(indexPath)
    }
}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    guard let block = self.aRowEditListener else { return false }
    return block(indexPath)
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if let block = self.aRowCommitListener{
        block(editingStyle, indexPath)
    }
}
}

Вы можете использовать его следующим образом:

 //Create a variable:
 var dataSource = TableViewDataSource()

 fileprivate func setUpDataSource() throws {

    DispatchQueue.main.async { [weak self] in 

    dataSource = TableViewDataSource.init(tableView: tblView, cellIdentifier: CellId.chatUserTVCell.rV, sectionCount: arrSection as Array<AnyObject>, rowCount: arrSearchChatListing , height: { (indexPath) -> CGFloat in
        return 80.0
    }, configureCellBlock: { (cell, item, indexPath) in
        guard let _cell = cell as? ChatUserTableCell, let _item = item as? ChatListing, let row = indexPath?.row else { return }
        _cell.chatListing = _item
        try? self?.shouldRequestPaging(row: row)
    }, aRowSelectedListener: { (indexPath) in
        let vc = StoryboardScene.Home.instantiateChatTextController()
        try? self?.pushVC(vc)
    }, aRowDeselectedListener: { (indexPath) in
        debugPrint("Deselected")
    }, aRowCommitListener: { (editingStyle, indexPath) in
        debugPrint("aRowCommitListener")
    }, DidScrollListener: { (scrollView) in
        debugPrint("DidScrollListener")
    })
    tblView.delegate = dataSource
    tblView.dataSource = dataSource
    tblView.reloadData()
}
}

Надеюсь, это поможет:)

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