如何基于所选的PickerView值更新textField?

问题描述 投票:-1回答:2

所以我有一个UIAlert和一个textField附加到它。当我在textField内部单击时,将显示pickerView,然后可以选择星期几。但是,当我从pickerView中选择任何一天时,textField仅在pickerView中显示第一个值,而当我选择其他值时不会更新。仍然会保存正确的选定值,并且会相应地更新tableView,但textField内部的文本不会更改。是因为它在警报中吗?

任何帮助将不胜感激。

import UIKit
import RealmSwift

class ViewController: UITableViewController, UITextFieldDelegate {

    let realm = try! Realm()

    var days : Results<Days>?
    var workouts : Results<Workouts>?

    var daysOfWeek : [String] = ["Monday", "Tuesday", "Wednsday", "Thursday", "Friday", "Saturday", "Sunday"]

    var indexCheck : Int = 0

    let picker = UIPickerView()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        picker.delegate = self
        picker.dataSource = self

        navigationItem.title = "Workouts"
        navigationController?.navigationBar.prefersLargeTitles = true

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")

        let addBarButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addWorkout))
        self.navigationItem.rightBarButtonItem = addBarButton


        loadDays()
    }

    @objc func addWorkout() {
        var textField1 = UITextField()
        var textField2 = UITextField()

        var containsDay = false
        var counter = 0
        textField1.delegate = self
        textField2.delegate = self

        let alert = UIAlertController(title: "New Workout", message: "Please name your workout...", preferredStyle: .alert)

        let addAction = UIAlertAction(title: "Add Workout", style: .default) { (UIAlertAction) in
            //Add day and workout to database
            //if day exists, append workout to the existing day.
            //if day doesn't exist, create a day and append workout to newly created day object.

            //First, we have to create an initial days object...
            //Need to check if ANY of the weekdays == picked day, only execute then.
            if self.days?.isEmpty == false {
                for i in 0...(self.days!.count - 1) {

                    if self.days?[i].weekday == self.daysOfWeek[self.picker.selectedRow(inComponent: 0)] {
                        containsDay = true
                        counter = i
                        break
                    }
                }

                if containsDay == true {
                    let newWorkout = Workouts()
                    newWorkout.title = textField2.text!

                    try! self.realm.write {
                        self.days?[counter].workout.append(newWorkout)
                        self.loadDays()
                    }
                } else {
                    let dow = Days()
                    let newWorkout = Workouts()
                    dow.weekday = self.daysOfWeek[self.picker.selectedRow(inComponent: 0)]
                    newWorkout.title = textField2.text!
                    dow.workout.append(newWorkout)
                    self.save(newDay: dow)
                }
            } else {
                let dow = Days()
                let newWorkout = Workouts()
                dow.weekday = self.daysOfWeek[self.picker.selectedRow(inComponent: 0)]
                newWorkout.title = textField2.text!
                dow.workout.append(newWorkout)

                self.save(newDay: dow)
            }
        }

        alert.addTextField { (alertTextField1) in
            alertTextField1.placeholder = "Day of Week"
            alertTextField1.text = self.daysOfWeek[self.picker.selectedRow(inComponent: 0)]
            textField1 = alertTextField1
            alertTextField1.inputView = self.picker

        }

        alert.addTextField { (alertTextField2) in
            alertTextField2.placeholder = "Muscle Group"
            textField2 = alertTextField2
            alertTextField2.inputView = nil
        }


        alert.addAction(addAction)
        present(alert, animated: true, completion: nil)
    }


    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let label = UILabel()
        label.text = days?[section].weekday ?? "Section Header"
        label.backgroundColor = UIColor.lightGray
        return label
    }

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

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return days?[section].workout.count ?? 0
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        let workout = days?[indexPath.section].workout[indexPath.row].title ?? "Workout"

        cell.textLabel?.text = "\(workout)  Section:\(indexPath.section) Row:\(indexPath.row)"

        return cell
    }


    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {
            try! realm.write {
                realm.delete((days?[indexPath.section].workout[indexPath.row])!)

                tableView.beginUpdates()

                tableView.deleteRows(at: [indexPath], with: .automatic)

                if days?[indexPath.section].workout.isEmpty == true {
                    realm.delete((days?[indexPath.section])!)
                    let indexSet = IndexSet(arrayLiteral: indexPath.section)
                    tableView.deleteSections(indexSet, with: .automatic)
                }

                tableView.endUpdates()
            }
        }
    }



    func loadDays() {
        days = realm.objects(Days.self)
        tableView.reloadData()
    }

    func save(newDay : Days) {
        do {
            try realm.write {
                realm.add(newDay)
            }
        } catch {
            print("Error saving day \(error)")
        }
        self.loadDays()
    }

}



extension ViewController : UIPickerViewDelegate, UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return 7
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return daysOfWeek[row]
    }

}
swift textfield picker
2个回答
0
投票

将文本字段对象声明为全局对象,并使用PickerView的didSelectRow方法在选择的基础上更改文本字段的值。

例如:-

let picker = UIPickerView()
var textField1 = UITextField()

下一步,使用以下方法获取选择的值:-

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    textField1.text = daysOfWeek[row]
}

0
投票

将两个文本文件对象都声明为全局对象

var textField1 = UITextField()
var textField2 = UITextField()

添加代码中更新的pickerview的委托方法:

extension ViewController : UIPickerViewDelegate, UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return 7
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return daysOfWeek[row]
    }

   func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        textField1.text = daysOfWeek[row]
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.