如果我在 detailTextLabel 中有空的 textField datePicker 传递数据,如何禁用“完成”按钮

How to disable Done button if I have empty textField datePicker pass data in detailTextLabel

我有两个视图控制器。第一个是 MyListOfTasksVC,第二个是 AddAndEditVC。在第二个 VC 中,我有一个日期选择器并将日期传递给 cellForRowAt 中的字幕标签。在实施之前,如果 textField 为空,我的“完成”按钮将被禁用。但是现在 datePicker 忽略了它并添加了只有日期的新行。

在这种情况下如何禁用完成按钮?我尝试过委托,但没有成功。

//in MyListOfTasksVC

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyDailyTasksCell", for: indexPath)
    
    let item = items[indexPath.row]
    configureText(for: cell, with: item)
    configureCheckmark(for: cell, with: item)
    
    let date = items[indexPath.row].date
    let formatter = DateFormatter()
    formatter.dateFormat = "MMM d, h:mm a"
    cell.detailTextLabel?.text = formatter.string(from: date)
    return cell
}

看起来您要构建的是一个 todo-list 应用程序,它可以防止用户输入没有标题的任务项。

您的第一个视图控制器,MyListOfTasksVC,显示所有已添加的任务。

您的第二个视图控制器 AddAndEditVC 有一个 UITextField 用于输入新任务的标题,还有一个 UIDatePicker 用于设置任务的截止日期。在第二个视图控制器的某处,有一个 'DONE' 按钮创建一个 Item 结构,其中 UITextField 中的文本作为 .title 属性 和日期从 UIDatePicker.date 属性。然后这个结构被传递回 MyListOfTasksVC 并附加到数组 items,并在 UITableView.

中显示为另一个任务

您问的问题似乎是,“如果 textField.text 的值为 nil 或空字符串,如何禁用此按钮?”

我知道的最简单的方法是在 UITextFieldDelegate 方法 textFieldDidEndEditing 中设置 'DONE' 按钮的 isEnabled 属性。如果文本字段的文本值为 nil"",请设置 doneButton.isEnabled = false。否则,doneButton.isEnabled = true。这样,按钮只允许提交有标题的新任务。

这是我里面的东西 AddAndEditVC:

import UIKit

class AddAndEditVC: UIViewController {
    @IBOutlet weak var taskNameField: UITextField!
    @IBOutlet weak var datePicker: UIDatePicker!
    @IBOutlet weak var doneButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        doneButton.isEnabled = false
        taskNameField.delegate = self
    }

    @IBAction func addNewTask(_ sender: UIButton) {
        self.performSegue(withIdentifier: "backToTasksList", sender: self)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let newItem = Item(title: taskNameField.text!, date: datePicker.date)
        let destinationVC = segue.destination as! MyListOfTasksVC
        destinationVC.newItem = newItem
    }
}

extension AddAndEditVC: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.endEditing(true)
        return true
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        if textField.text != nil && textField.text != "" {
            doneButton.isEnabled = true
        } else {
            doneButton.isEnabled = false
        }
    }
}

这里是 MyListOfTasksVC:

import UIKit

struct Item {
    var title: String
    var date: Date
}

class MyListOfTasksVC: UIViewController {
    @IBOutlet weak var tasksTable: UITableView!
    
    var newItem: Item?
    
    var items: [Item] = [Item(title: "Wake Up", date: Date()), Item(title: "Feed Dog", date: Date()), Item(title: "Finish Report", date: Date())]

    override func viewDidLoad() {
        super.viewDidLoad()
        tasksTable.dataSource = self
        
        if newItem != nil {
            items.append(newItem!)
        }
    }

    @IBAction func toAddAndEditScreen(_ sender: UIButton) {
        self.performSegue(withIdentifier: "toAddAndEdit", sender: self)
    }
}

extension MyListOfTasksVC: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyDailyTasksCell", for: indexPath)
        
        let item = items[indexPath.row]
        //configureText(for: cell, with: item)
        //configureCheckmark(for: cell, with: item)
        
        cell.textLabel?.text = item.title
        
        let date = items[indexPath.row].date
        let formatter = DateFormatter()
        formatter.dateFormat = "MMM d, h:mm a"
        cell.detailTextLabel?.text = formatter.string(from: date)
        return cell
    }
}

这是您正在寻找的功能吗?