在嵌入UITableviewCell,Swift

时间:2017-09-25 08:29:51

标签: ios swift uitableview swift3 uicollectionview

我在UICollectionView内部制作了UITableViewCell,但效果非常好。我唯一的问题是,我无法通过didSelectItemAt方法对另一个ViewController执行Segue。

我知道我必须从TableViewController执行它,我在Storyboard上做了一个segue,我尝试了多种可能性但由于某些原因它不起作用。

这是我的TableviewController

import UIKit
import RealmSwift
import SwiftyJSON

class HomeVTwoTableViewController: UITableViewController {

let realm = try! Realm()
let headers = ["1","2","3"]

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

override func viewWillAppear(_ animated: Bool) {    
    self.tableView.separatorStyle = .none
}


//MARK: Custom Tableview Headers
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return headers[section]
}

//MARK: DataSource Methods
override func numberOfSections(in tableView: UITableView) -> Int {
    return headers.count
}

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

//Choosing the responsible PrototypCell for the Sections
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellBig", for: indexPath) as! HomeVTwoTableViewCell
        cell.update()
        return cell
    } else {
        return UITableViewCell()
    }
}
// This on of my tries to perform a segue
func liveCellSelected() {
    performSegue(withIdentifier: "showChat", sender: nil)
}
}

此处我的TableViewCell嵌入了CollectionView

import UIKit
import RealmSwift



class HomeVTwoTableViewCell: UITableViewCell{

var liveCommunities: Results<Community>?

@IBOutlet weak var collectionView: UICollectionView!

override func awakeFromNib() {
    super.awakeFromNib()
    collectionView.delegate = self
    collectionView.dataSource = self
}
}

extension HomeVTwoTableViewCell: 
UICollectionViewDataSource,UICollectionViewDelegate {

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

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return(liveCommunities?.count)!
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCellBig", for: indexPath) as? HomeVTwoCollectionViewCell else
    {
        fatalError("Cell has wrong type")
    }
    //removes the old image
    cell.imageView.image = UIImage(named: "No Image")
    cell.titleLbl.text = nil

    //set url and Picture
    url = (liveCommunities?[indexPath.row].pictureId)!
    let name : String = (liveCommunities?[indexPath.row].communityName)!
    let channelName : String = (liveCommunities?[indexPath.row].channelName)!

    cell.titleLbl.text = name
    cell.senderLbl.text = channelName
    cell.imageView.downloadedFrom(link :"someSecretUrl")

    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedCommunity = (liveCommunities?[indexPath.row].communityId)!
    HomeVTwoTableViewController().liveCellSelected()
}
}

我发现another question具有类似的主题,但是在没有对现有委托产生问题的情况下无法实现委托协议。

也许这是一个明显的错误,但我看不到它。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

您正在使用以下方法实例化家庭控制器的新instacne:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedCommunity = (liveCommunities?[indexPath.row].communityId)!
    HomeVTwoTableViewController().liveCellSelected()
}

您应该做的是通过委托制作,或者将您的collectionview委托移动到主控制器

protocol CellCollectionViewDelegate: class{
  func didselect()
}

并在单元格和家庭控制器中实现委托

答案 1 :(得分:0)

可能是你可以创建一个变量来处理这个问题。你也可以选择。

class HomeVTwoTableViewCell: UITableViewCell{
var liveCommunities: Results<Community>?
@IBOutlet weak var collectionView: UICollectionView!
var didSelectAction: () -> Void // add your action here

您可以在这里调用此功能

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedCommunity = (liveCommunities?[indexPath.row].communityId)!
    HomeVTwoTableViewController().liveCellSelected()
    didSelectAction() // Invoque your action
}

//在单元格创建器上,当您要点击单元格时添加导航或逻辑

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellBig", for: indexPath) as! HomeVTwoTableViewCell
        cell.update()
        cell.didSelectAction = {
           // add here your navigation
        }
        return cell
    } else {
        return UITableViewCell()
    }
}

答案 2 :(得分:0)

好的,因为这个问题似乎有两个解决方案。 一个是通过变量,一个是通过委托。据我所知,代理人更常见。

具有变量的解决方案1:

这是我的TableviewController

import UIKit

class TableViewController: UITableViewController {

let headers = ["1","2","3"]

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

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

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellBig", for: indexPath) as! HomeVTwoTableViewCell
  //Fill function, insert Navigation      
  cell.didSelectAction = {
            self.performSegue(withIdentifier: "testSegue", sender: nil)
        }
        return cell
}

此处我的TableViewCell嵌入了CollectionView

import UIKit

class HomeVTwoTableViewCell: UITableViewCell{

var liveCommunities: Results<Community>?
//Instantiate function
var didSelectAction: () -> Void = {}

@IBOutlet weak var collectionView: UICollectionView!

override func awakeFromNib() {
    super.awakeFromNib()
    collectionView.delegate = self
    collectionView.dataSource = self
}
}

extension HomeVTwoTableViewCell: 
UICollectionViewDataSource,UICollectionViewDelegate {

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

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return(liveCommunities?.count)!
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCellBig", for: indexPath) as? HomeVTwoCollectionViewCell else
    {
        fatalError("Cell has wrong type")
    }
    //removes the old text
    cell.titleLbl.text = nil
    cell.senderLbl.text = nil

    let name : String = (liveCommunities?[indexPath.row].communityName)!
    let channelName : String = (liveCommunities?[indexPath.row].channelName)!

    cell.titleLbl.text = name
    cell.senderLbl.text = channelName

    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedCommunity = (liveCommunities?[indexPath.row].communityId)!
  // Invoque your action 
  didSelectAction()
}
}

具有代表和协议的解决方案2:

这是我的TableviewController

import UIKit

class TableViewController: UITableViewController {

let headers = ["1","2","3"]

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

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

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellBig", for: indexPath) as! HomeVTwoTableViewCell
  //Add delegate      
  cell.delegate = self
  return cell
}
 //Add Extension with Navigation
 extension HomeVTwoTableViewController: CellCollectionViewDelegate {
     func didSelect() {
         performSegue(withIdentifier: "showChat", sender: nil)
    }
}

此处我的TableViewCell嵌入了CollectionView

import UIKit
//Create a delegate protocol
protocol CellCollectionViewDelegate: class{
func didSelect()
}

class HomeVTwoTableViewCell: UITableViewCell{

var liveCommunities: Results<Community>?
//Add a delegate property
weak var delegate: CellCollectionViewDelegate?

@IBOutlet weak var collectionView: UICollectionView!

override func awakeFromNib() {
    super.awakeFromNib()
    collectionView.delegate = self
    collectionView.dataSource = self
}
}
//Adopt and implement the Delegate Protocol
extension HomeVTwoTableViewCell: 
UICollectionViewDataSource,UICollectionViewDelegate {

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

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return(liveCommunities?.count)!
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCellBig", for: indexPath) as? HomeVTwoCollectionViewCell else
    {
        fatalError("Cell has wrong type")
    }
    //removes the old text
    cell.titleLbl.text = nil
    cell.senderLbl.text = nil

    let name : String = (liveCommunities?[indexPath.row].communityName)!
    let channelName : String = (liveCommunities?[indexPath.row].channelName)!

    cell.titleLbl.text = name
    cell.senderLbl.text = channelName

    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedCommunity = (liveCommunities?[indexPath.row].communityId)!
    //call delegate method
    delegate?.didSelect()
}
}

我试图从

总结解决方案

Abdoelrhman Mohamed和Alexkater并详细写出来。

告诉我是否有问题或遗漏。