Function inside prepareForSegue will not execute

允我心安 提交于 2019-12-08 13:46:37

问题


I am making a table view with channels inside it which users can tap to get into that channel. When the user has tapped that channel, I want to get the channel's ID and name from firebase. The following function should be working, but it is not. The prepare for segue function itself is executed, but not the if let channel = sender as? Channel { //not executing }. So I do not see the "executed" print.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
        if let channel = sender as? Channel {
        print("executed")
        let chatVc = segue.destination as! channelMultiplayerViewController
        chatVc.channel = channel
        chatVc.channelRef = channelRef.child(channel.id)
    }
}

This is my full code if you need it:

import UIKit
import Firebase
import Foundation

enum Section: Int {
    case createNewChannelSection = 0
    case currentChannelsSection
}

extension multiplayerChannelView: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        filterContentForSearchText(searchText: searchController.searchBar.text!)
    }
}

class multiplayerChannelView: UITableViewController {


    // MARK: Properties
    var channels: [Channel] = []
    let searchController = UISearchController(searchResultsController: nil)
    var filteredChannels = [Channel]()
    private lazy var channelRef: FIRDatabaseReference = FIRDatabase.database().reference().child("channels")
    private var channelRefHandle: FIRDatabaseHandle?
    var senderDisplayName: String?
    var newChannelTextField: UITextField?


    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Rooms"
        observeChannels()
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        tableView.tableHeaderView = searchController.searchBar
    }
    deinit {
        if let refHandle = channelRefHandle {
            channelRef.removeObserver(withHandle: refHandle)
        }
    }
    func filterContentForSearchText(searchText: String, scope: String = "All") {
        filteredChannels = channels.filter { Channel in
            return (Channel.name.lowercased().range(of: searchText.lowercased()) != nil)
        }

        tableView.reloadData()
    }
    @IBAction func createChannel(_ sender: AnyObject) {
        if let name = newChannelTextField?.text {
            let newChannelRef = channelRef.childByAutoId()
            let channelItem = [
                "name": name
            ]
            newChannelRef.setValue(channelItem)
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
    private func observeChannels() {
        channelRefHandle = channelRef.observe(.childAdded, with: { (snapshot) -> Void in // 1
            let channelData = snapshot.value as! Dictionary<String, AnyObject> // 2
            let id = snapshot.key
            if let name = channelData["name"] as! String!, name.characters.count > 0 {
                self.channels.append(Channel(id, name: name))
                self.tableView.reloadData()
            } else {
                print("Error! Could not decode channel data")
            }
        })
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

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

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let currentSection: Section = Section(rawValue: section) {
            switch currentSection {
            case .createNewChannelSection:
                return 1

            case .currentChannelsSection:
                if searchController.isActive && searchController.searchBar.text != "" {
                    return filteredChannels.count
                }
                else{
                    return channels.count
                }
            }
        } else {
            return 0
        }
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let reuseIdentifier = (indexPath as NSIndexPath).section == Section.createNewChannelSection.rawValue ? "NewChannel" : "ExistingChannel"
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)

        if (indexPath as NSIndexPath).section == Section.createNewChannelSection.rawValue {
            if let createNewChannelCell = cell as? CreateChannelCell {
                newChannelTextField = createNewChannelCell.newChannelNameField
            }
        } else if (indexPath as NSIndexPath).section == Section.currentChannelsSection.rawValue {
            if searchController.isActive && searchController.searchBar.text != "" {
                cell.textLabel?.text = filteredChannels[(indexPath as NSIndexPath).row].name
            } else {
                cell.textLabel?.text = channels[(indexPath as NSIndexPath).row].name
            }
        }

        return cell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)
            if let channel = sender as? Channel {
            print("executed")
            let chatVc = segue.destination as! channelMultiplayerViewController
            chatVc.channel = channel
            chatVc.channelRef = channelRef.child(channel.id)
        }
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.section == Section.currentChannelsSection.rawValue {
            var channel = channels
            if searchController.isActive && searchController.searchBar.text != "" {
                channel = [filteredChannels[(indexPath as NSIndexPath).row]]
                     }
            else
            {
                channel = [channels[(indexPath as NSIndexPath).row]]
            }

            self.performSegue(withIdentifier: "ShowChannel", sender: channel)
        }
    }

}

This is a .swift file of the type Channel

import Foundation

class Channel: NSObject {
    let id:String
    let name:String
    init (_ id:String, name:String){
        self.id = id
        self.name = name
    }
}

Thank you!


回答1:


I responded to your last post as well, but You are sending an array of channels to

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
        if let channel = sender as? Channel {
        print("executed")
        let chatVc = segue.destination as! channelMultiplayerViewController
        chatVc.channel = channel
        chatVc.channelRef = channelRef.child(channel.id)
    }
}

So the block - if let channel = sender as? Channel - will not work.

Change the cell selection code to:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.section == Section.currentChannelsSection.rawValue {
        if searchController.isActive && searchController.searchBar.text != "" {
            let channel = filteredChannels[indexPath.row]
            self.performSegue(withIdentifier: "ShowChannel", sender: channel)
                 }
        else
        {
            let channel = channels[indexPath.row]
            self.performSegue(withIdentifier: "ShowChannel", sender: channel)
        }
    }
}


来源:https://stackoverflow.com/questions/42333207/function-inside-prepareforsegue-will-not-execute

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!