Не удается вызвать значение нефункционального типа 'UITableView?' в методе UITapGestureRecognizer - PullRequest
0 голосов
/ 06 июня 2019

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

Ошибка в tableTapped внутри оператора if let.

Я попытался удалить и воссоздать tableView в построителе историй.Также попытался «домашнее задание» вместо «tableView» и имя параметра.Также попытался удалить «себя».до 'tableView'.

У меня точно такой же метод в другом классе, и он отлично работает, поэтому я предполагаю, что в классе, в котором он не работает, есть что-то другое. Я просто не могу его точно определить!

import UIKit

class homeworkViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var clear: UIButton!
    @IBOutlet weak var all: UIButton!
    @IBOutlet weak var chosen: UIButton!

    var languages = [String]()
    var chosenLanguage = String()
    var chosenLanguageRemoved = false
    var homeworkWords = [String]()
    var chosenLanguageEnabled = false
    let wordString = "words"

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(test))

        let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
        self.tableView.backgroundView = UIView()
        self.tableView.backgroundView?.addGestureRecognizer(tap)
        // Do any additional setup after loading the view.
    }

    @objc func tableTapped(tap:UITapGestureRecognizer) {
        let location = tap.location(in: self.tableView)
        let path = self.tableView.indexPathForRow(at: location)
        if let indexPathForRow = path {
            self.tableView(self.tableView, didSelectRowAt: indexPathForRow)
        } else {
            if homeworkWords.isEmpty == true {
                let ac = UIAlertController(title: "Add Homework!", message: nil, preferredStyle: .alert)
                let okAction = UIAlertAction(title: "OK", style: .default)
                ac.addAction(okAction)
                present(ac, animated: true)
            }
        }
    }

    @IBAction func chosen(_ sender: UIButton) {
        let ac = UIAlertController(title: "Use Chosen Language", message: "Add or clear choosen language words to quickly set homework.", preferredStyle: .alert)
        // add user actions, "Cancel" to abort
        if chosenLanguageEnabled == false {
            ac.addAction(UIAlertAction(title: "Set", style: .default, handler: chosenLanguage))
        }
        if chosenLanguageEnabled == true {
            ac.addAction(UIAlertAction(title: "Clear", style: .default, handler: clearChosenLanguage))
        }
        ac.addAction(UIAlertAction(title: "Cancel", style: .cancel))
    }

    func chosenLanguage(action: UIAlertAction!) {
        homeworkWords.removeAll()
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.hyperpolyglot.todayview") {
            if var savedWords = defaults.object(forKey: "\(chosenLanguage)\(wordString)") as? [String] {
                print("savedWords in chosenLanguage in homeworkViewController are: \(savedWords)")
                homeworkWords = savedWords
                saveWords()
                savedWords.removeAll()
                chosenLanguageEnabled = true
                print("chosenLanguageEnabled in chosenLanguage method in homeworkViewController is: \(chosenLanguageEnabled)")
                print("homeworkWords in chosenLanguage method in homeworkViewController are: \(homeworkWords)")
                print("savedWords after clear all in chosenLanguage method in homeworkViewController are: \(savedWords)")
            }
        }
    }

    func clearChosenLanguage(action: UIAlertAction!) {
        homeworkWords.removeAll()
        saveWords()
        chosenLanguageEnabled = false
    }

    @IBAction func allWords(_ sender: UIButton) {
        homeworkWords.removeAll()
        for language in languages {
            if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.hyperpolyglot.todayview") {
                if var savedWords = defaults.object(forKey: "\(language)\(wordString)") as? [String] {
                    print("savedWords array is: \(savedWords)")
                    homeworkWords.append(contentsOf: savedWords)
                    saveWords()
                    savedWords.removeAll()
                    print("allWords method homeworkWords are: \(homeworkWords)")
                    print("allWords savedWords after clear all: \(savedWords)")
                }
            }
        }
    }

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

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let delete = UITableViewRowAction(style: .default, title: "Delete") { (action, indexPath) in

            self.homeworkWords.remove(at: indexPath.row)
            self.saveWords()
            tableView.beginUpdates()
            tableView.deleteRows(at: [indexPath], with: .left)
            tableView.endUpdates()
            // delete item at indexPath
            if self.homeworkWords.isEmpty == true {
                self.clear.isEnabled = false
                self.clear.alpha = 0.25
            }
        }

        delete.backgroundColor = UIColor.red
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.isHighlighted = true
        }
        return [delete]
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //print("In cellForRowAt function")
        let cell = tableView.dequeueReusableCell(withIdentifier: "homework", for: indexPath)

        let word = homeworkWords[indexPath.row]

        cell.textLabel?.text = word.capitalized

        //print(cell)
        return cell
    }

    func loadHomeworkWords() {
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.hyperpolyglot.todayview") {
            if var savedHomeWorkWords = defaults.object(forKey: "homeworkWords") as? [String] {
                print("savedLanguages array is: \(savedHomeWorkWords)")
                homeworkWords.removeAll()
                homeworkWords = savedHomeWorkWords
                savedHomeWorkWords.removeAll()
                print("savedHomeWorkWords after removeAll: \(savedHomeWorkWords)")
                print("loadHomeworkWords homeworkWords are: \(homeworkWords)")
            }
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        loadHomeworkWords()
        tableView.reloadData()
    }

    func saveWords() {
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.hyperpolyglot.todayview") {
            defaults.set(homeworkWords, forKey: "homeworkWords")
                print("saveWords homeworkWords homeworkViewController are: \(homeworkWords)")
        }
    }
}

Я ожидаю увидеть сообщение UIAlertAction, сообщающее пользователю, что ему нужно добавить некоторые значения строки таблицы, нажав на кнопку «Все слова» или кнопку «выбранный язык», если влюбая из строк таблицы.

Вместо этого я получаю сообщение об ошибке перед компиляцией:

Невозможно вызвать значение нефункционального типа 'UITableView?'

...