Есть ли способ заставить текст в TextField в Swift быть необязательным? - PullRequest
1 голос
/ 14 июня 2019

Я создаю приложение, которое принимает входные данные из textFields в alertController, затем сохраняет их в CoreData и в конечном итоге отображает в tableView.

На данный момент планируется создать строку для создания CSV, объединив вместе textField.text, что-то вроде

let string CSV = textField.text + " ," + textField2.text + " ," + ...

Однако, когда я попытался это сделать, они сказали, что я не могу принудительно развернуть необязательное значение.

Я пытался поставить "!" в textField.text и т. д., но все они все еще рассматриваются как необязательные значения. Текстовые поля, когда они используются в приложении, всегда должны быть заполнены, но я не смог найти способ выдать ошибку, заставляющую пользователя приложения заполнить значение.

Вот мой ViewController:

import UIKit
import CoreData

class ViewController: UITableViewController {

    var alarmItems: [NSManagedObject] = []
    let cellId = "cellId"

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        navigationController?.navigationBar.barTintColor = UIColor(red: 21/255, green: 101/255, blue: 192/255, alpha: 1)
        navigationController?.navigationBar.tintColor = .white
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add Alarm", style: .plain, target: self, action: #selector(addAlarmItem))
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "AlarmItems")
        do {
            alarmItems = try managedContext.fetch(fetchRequest)
        } catch let err as NSError {
            print("Failed to fetch items", err)
        }
    }

    //now to figure out how to add multiple text fields

    @objc func addAlarmItem(_ sender: AnyObject) {
        print("this works")
        let alertController = UIAlertController(title: "Add New Item", message: "Please fill in the blanks", preferredStyle: .alert)
        let saveAction = UIAlertAction(title: "Save", style: .default) { [unowned self] action in
            guard let textField = alertController.textFields!.first, let itemToAdd = textField.text else { return }

            //guard let textField2 = alertController.textFields?.first, let itemToAdd2 = textField2.text else { return } //tried this to get the input of a second textField

            /*

            one thing I tried:
            let textField1 = alertController.textFields[0]
            let textField1String = textField1.text!

            let textField2 = alertController.textFields![1]
            let textField2String = textField2.text
            let itemToAdd = textField1String + textField2String
            */



            //var textField1String = textField1.text
            //let textField2 = alertController.textFields![1]
            //var textField2String = textField2.text


            self.save(itemToAdd)
            //self.save(itemToAdd2)
            self.tableView.reloadData()
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: nil)
        //alertController.addTextField(configurationHandler: nil)
        alertController.addTextField { (textField) in
            textField.placeholder = "First"
        }
        alertController.addTextField { (textField) in
            textField.placeholder = "Second"
        }

        //let combinedString = UITextField[0] + " ," + UITextField[1]
        alertController.addAction(saveAction)
        alertController.addAction(cancelAction)
        present(alertController, animated: true, completion: nil)
    }

    func save(_ itemName: String) {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedContext = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "AlarmItems", in: managedContext)!
        let item = NSManagedObject(entity: entity, insertInto: managedContext)
        item.setValue(itemName, forKey: "alarmAttributes")

        do {
            try managedContext.save()
            alarmItems.append(item)

        } catch let err as NSError {
            print("Failed to save an item", err)
        }
    }

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
        let alarmItem = alarmItems[indexPath.row]
        cell.textLabel?.text = alarmItem.value(forKeyPath: "alarmAttributes") as? String
        return cell
    }
}

Ответы [ 3 ]

3 голосов
/ 14 июня 2019

Вы можете использовать CompactMap для простого преобразования массива опциональных файлов в массив неопциональных.

let myStrings: [String] = alert.textfields!.compactMap { $0.text }
let myText = myStrings.joined(separator: ", ")

Чтобы узнать больше о CompactMap, перейдите к https://developer.apple.com/documentation/swift/sequence/2950916-compactmap

0 голосов
/ 14 июня 2019

Вы можете использовать расширение строки, чтобы развернуть текст следующим образом:

extension Optional where Wrapped == String{
func safe() -> String{
    if self == nil{
        return ""
    }else{
        return self.unsafelyUnwrapped
    }
}

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

0 голосов
/ 14 июня 2019

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

Не думаю, что вы можете показать какую-то ошибку внутри вашего исходного контроллера предупреждений в текстовом поле. Вы должны проверить текст отдельно, а затем показать отдельное окно с предупреждением об ошибке.

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