Как вызвать функцию, когда UINavigationController UINavigationTabBar элемент коснулся? - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу иметь возможность представить UIAlertAction, когда пользователь касается элемента UINavigationController UINavigationTabBar, чтобы напомнить ему, что ему нужно ввести некоторую информацию, прежде чем он сможет перейти к следующему элементу UIViewController, который в противном случае вызывался бы из такого касания.Код, который вызывается из-под крана, проверит, если массив пуст, если это так, а затем отобразит UIAlertAction.

Я попытался создать экземпляр элемента UINavigationController UINavigationTabBar, чтобы попытаться обнаружить, что он являетсянажал, но это грязно, так как вызываемый UIViewController уже был настроен как segue, когда элемент UINavigationTabBar коснулся.

Нужно ли откатить назад и удалить существующий переход и создать переход другим способомчто позволяет моему желаемому коду проверки массива вызываться при нажатии пользователем?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019
import UIKit

class WordsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    // write button selector method to check if there are any words.

    var words = [String]()
    var languages = [String]()
    var chosenLanguage = String()
    var textField: UITextField?
    let wordString = "Words"

    override func viewDidLoad() {
        super.viewDidLoad()

        chosenLanguageLoad()
        loadInitialValues()

        //let titleAttributes = [NSAttributedString.Key.font: UIFont(name: "AmericanTypewriter", size: 22)!]
        //navigationController?.navigationBar.titleTextAttributes = titleAttributes

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

        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addNewWord))

        print("languages array is: \(languages)")
    }

    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        if identifier == "Words" {
            print("inside identifier == words if")
            var isValid = true
            if languages.isEmpty == true {
                print("languages is empty is true")
                isValid = false
            }

            return isValid
        }
        // otherwise delegates the superclass
        return super.shouldPerformSegue(withIdentifier: identifier, sender: sender)
    }

    @objc func test() {
        if words.isEmpty == true {
            let ac = UIAlertController(title: "Add Some Words", message: nil, preferredStyle: .alert)
            let okAction = UIAlertAction(title: "OK", style: .default)
            ac.addAction(okAction)
            present(ac, animated: true)
        } else {
            self.performSegue(withIdentifier: "Test", sender: self)
        }
    }

    func chosenLanguageLoad() {
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.polyglot") {
            if let loadChosenLanguage = defaults.object(forKey: "languageChosen") as? String {
                chosenLanguage = loadChosenLanguage
                print("Chosen language is: \(chosenLanguage)")
            }
        }
    }

    @objc func loadInitialValues() {
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.polyglot") {
            words.removeAll()
            tableView.reloadData()
            print("Words array after clear all: \(words)")
            print("chosenLanguage in loadInitialValues: \(chosenLanguage)")
            print("\(chosenLanguage)\(wordString)")
            if var savedWords = defaults.object(forKey: "\(chosenLanguage)\(wordString)") as? [String] {
                print("savedWords array is: \(savedWords)")
                words = savedWords
                savedWords.removeAll()
                print("savedWords array after clear all: \(savedWords)")
            } else {
                saveInitialWordValues(to: defaults)
            }
            print("Words is : \(words)")
            print("Number of words: \(words.count)")
            tableView.reloadData()
        }
    }

    func saveInitialWordValues(to defaults: UserDefaults) {
        switch chosenLanguage {
        case "german":
            words.append("Bear::Baissespekulant::0")
            words.append("Camel::Kamel::0")
            words.append("Cow::Rind::0")
            words.append("Fox::Fuchs::0")
            words.append("Goat::Geiß::0")
            words.append("Monkey::Affe::0")
            words.append("Pig::Schwein::0")
            words.append("Rabbit::Karnickel::0")
            words.append("Sheep::Schaf::0")
            //words.append("::")
            print(words)
            defaults.set(words, forKey: "germanWords")
            print("At end of saveInitialGermanValues")
        case "french":
            words.append("Bear::l'ours::0")
            words.append("Camel::le chameau::0")
            words.append("Cow::la vache::0")
            words.append("Fox::le renard::0")
            words.append("Goat::la chèvre::0")
            words.append("Monkey::le singe::0")
            words.append("Pig::le cochon::0")
            words.append("Rabbit::le lapin::0")
            words.append("Sheep::le mouton::0")
            //words.append("::")
            print(words)
            defaults.set(words, forKey: "frenchWords")
            print("At end of saveInitialFrenchValues")
        default:
            break
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        chosenLanguageLoad()
        loadInitialValues()
    }

    override func viewDidAppear(_ animated: Bool) {

        navigationController?.setToolbarHidden(true, animated: false)

        super.viewDidAppear(animated)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }

    @objc func addNewWord() {
        // create our alert controller
        let ac = UIAlertController(title: "Add new word", message: nil, preferredStyle: .alert)

        // add two text fields, one for English and one for French or German.
        ac.addTextField { textField in
            textField.placeholder = "English"
        }

        ac.addTextField { (textField) in
            textField.placeholder = "\(self.chosenLanguage.capitalized)"
        }

        // create an "Add Word" button that submits the user's input
        let submitAction = UIAlertAction(title: "Add Word", style: .default) { [unowned self, ac] (action: UIAlertAction!) in
            // pull out the English and French words, or an empty string if there was a problem
            let firstWord = ac.textFields?[0].text ?? ""
            let secondWord = ac.textFields?[1].text ?? ""
            let zeroTimesWrong = "0"
            // submit the English and French word to the insertFlashcard() method
            self.insertFlashcard(first: firstWord, second: secondWord, third: zeroTimesWrong)
        }

        // add the submit action, plus a cancel button
        ac.addAction(submitAction)
        ac.addAction(UIAlertAction(title: "Cancel", style: .cancel))

        // present the alert controller to the user
        present(ac, animated: true)
    }

    func insertFlashcard(first: String, second: String, third: String) {
        guard first.count > 0 && second.count > 0 else { return }

        let newIndexPath = IndexPath(row: words.count, section: 0)

        words.append("\(first)::\(second)::\(third)")
        tableView.insertRows(at: [newIndexPath], with: .automatic)

        saveWords()
    }

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let delete  = UITableViewRowAction(style: .default, title: "Delete") { action, indexPath in
            self.words.remove(at: indexPath.row)
            tableView.beginUpdates()
            tableView.deleteRows(at: [indexPath], with: .left)
            tableView.endUpdates()
            // delete item at indexPath
        }

        let edit = UITableViewRowAction(style: .normal, title: "Edit") { (action, indexPath) in
            let ac = UIAlertController(title: "Edit word", message: nil, preferredStyle: .alert)

            // add two text fields, one for English and one for French
            ac.addTextField { textField in
                let word = self.words[indexPath.row]
                let split = word.components(separatedBy: "::")
                let englishWord = split[0]
                textField.placeholder = "\(englishWord)"
            }

            ac.addTextField { (textField) in
                let word = self.words[indexPath.row]
                let split = word.components(separatedBy: "::")
                let foreignWord = split[1]
                textField.placeholder = "\(foreignWord)"
            }

            // create an "Add Word" button that submits the user's input
            let submitAction = UIAlertAction(title: "Edit Word", style: .default) { [unowned self, ac] (action: UIAlertAction!) in
                // pull out the English and French words, or an empty string if there was a problem
                let firstWord = ac.textFields?[0].text ?? ""
                let secondWord = ac.textFields?[1].text ?? ""

                guard firstWord.count > 0 && secondWord.count > 0 else { return }
                // edit item at indexPath
                self.words.remove(at: indexPath.row)
                self.words.insert("\(firstWord)::\(secondWord)", at: indexPath.row)
                tableView.beginUpdates()
                tableView.deleteRows(at: [indexPath], with: .automatic)
                tableView.insertRows(at: [indexPath], with: .automatic)
                tableView.endUpdates()

                self.saveWords()
            }

            // add the submit action, plus a cancel button
            ac.addAction(submitAction)
            ac.addAction(UIAlertAction(title: "Cancel", style: .cancel))

            // present the alert controller to the user
            self.present(ac, animated: true)
        }

        edit.backgroundColor = UIColor.blue

        return [delete, edit]
    }

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

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

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

        let word = words[indexPath.row]
        if word != "::" {
            let split = word.components(separatedBy: "::")

            print(split[0])

            cell.textLabel?.text = split[0]

            cell.detailTextLabel?.text = ""

            //print(cell)
        }
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        if let cell = tableView.cellForRow(at: indexPath) {
            if cell.detailTextLabel?.text == "" {
                let word = words[indexPath.row]
                let split = word.components(separatedBy: "::")
                cell.detailTextLabel?.text = split[1]
            } else {
                cell.detailTextLabel?.text = ""
            }
        }
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        words.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .automatic)
        saveWords()
    }

    func saveWords() {
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.polyglot") {
            defaults.set(words, forKey: "\(chosenLanguage)\(wordString)")
        }
    }
}


0 голосов
/ 15 апреля 2019

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

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    if identifier == "NextViewControllerID" {
        var isValid = true

        // example of validation, do your stuff here
        if myTextField.text?.count ?? 0 < 5 {
            isValid = false
        }

        return isValid
    }
    // otherwise delegates the superclass
    return super.shouldPerformSegue(withIdentifier: identifier, sender: sender)
}
...