如果我在 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
}
}
这是您正在寻找的功能吗?
我有两个视图控制器。第一个是 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
}
}
这是您正在寻找的功能吗?