我在弄清楚如何更改我的代码时遇到了麻烦,因此当我填写了三个文本字段时,启用了导航栏中的“完成”按钮。
我目前有3个UITextField和1个UIButtonItem。habitNameField和goalField都是手动文本字段,而frequencyField是Picker
View。
@IBOutlet weak var habitNameField: UITextField!
@IBOutlet weak var goalField: UITextField!
@IBOutlet weak var frequencyField: UITextField!
@IBOutlet weak var doneBarButton: UIBarButtonItem!
当第一个字段中键入内容时,我还有以下功能可以使用。
func textField(habitNameField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let oldHabitNameText: NSString = habitNameField.text!
let newHabitNameText: NSString = oldHabitNameText.stringByReplacingCharactersInRange(range, withString: string)
doneBarButton.enabled = (newHabitNameText.length != 0)
return true
}
我尝试更改代码,以便将其他两个字段用作参数,并且仅在填写了所有三个字段的情况下才启用doneBarButton。
func textField(habitNameField: UITextField, goalField: UITextField, frequencyField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let habitNameText: NSString = (habitNameField.text!).stringByReplacingCharactersInRange(range, withString: string)
let goalText: NSString = (goalField.text!).stringByReplacingCharactersInRange(range, withString: string)
let frequencyText: NSString = (frequencyField.text!).stringByReplacingCharactersInRange(range, withString: string)
doneBarButton.enabled = (habitNameText.length != 0) && (goalText.length != 0) && (frequencyText.length != 0)
return true
}
但是,即使我填写了所有三个文本字段,它也不起作用。
非常感谢您的帮助,并感谢任何提前做出贡献的人!
所有代码在这里:
class HabitDetailViewController: UITableViewController, UITextFieldDelegate, UIPickerViewDataSource,UIPickerViewDelegate {
@IBOutlet weak var habitNameField: UITextField!
@IBOutlet weak var goalField: UITextField!
@IBOutlet weak var doneBarButton: UIBarButtonItem!
@IBOutlet weak var frequencyField: UITextField!
var frequencies = ["Day", "Week", "Month", "Year"]
var frequencyPicker = UIPickerView()
var habitToEdit: HabitItem?
weak var delegate: HabitDetailViewControllerDelegate?
@IBAction func cancel() {
delegate?.habitDetailViewControllerDidCancel(self)
}
@IBAction func done() {
print("You plan to do \(habitNameField.text!) \(goalField.text!) times a \(frequencyField.text!.lowercaseString).")
if let habit = habitToEdit {
habit.name = habitNameField.text!
habit.numberLeft = Int(goalField.text!)!
habit.frequency = frequencyField.text!
delegate?.habitDetailViewController(self, didFinishEditingHabit: habit)
} else {
let habit = HabitItem()
habit.name = habitNameField.text!
habit.numberLeft = Int(goalField.text!)!
habit.frequency = frequencyField.text!
habit.completed = false
delegate?.habitDetailViewController(self, didFinishAddingHabit: habit)
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
habitNameField.becomeFirstResponder()
frequencyPicker.hidden = false
}
override func viewDidLoad() {
super.viewDidLoad()
frequencyPicker.dataSource = self
frequencyPicker.delegate = self
doneBarButton.enabled = false
habitNameField.addTarget(self, action: "checkFields:", forControlEvents: .EditingChanged)
goalField.addTarget(self, action: "checkFields:", forControlEvents: .EditingChanged)
frequencyField.addTarget(self, action: "checkFields:", forControlEvents: .EditingChanged)
frequencyField.inputView = frequencyPicker
if let habit = habitToEdit {
title = "Edit Item"
habitNameField.text = habit.name
goalField.text = String(habit.numberLeft)
doneBarButton.enabled = true
}
}
override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
return nil
}
func textField(habitNameField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let oldHabitNameText: NSString = habitNameField.text!
let newHabitNameText: NSString = oldHabitNameText.stringByReplacingCharactersInRange(range, withString: string)
doneBarButton.enabled = (newHabitNameText.length != 0)
return true
}
func checkFields(sender: UITextField) {
sender.text = sender.text?.stringByTrimmingCharactersInSet(.whitespaceCharacterSet())
guard
let habit = habitNameField.text where !habit.isEmpty,
let goal = goalField.text where !goal.isEmpty,
let frequency = frequencyField.text where !frequency.isEmpty
else { return }
// enable your button if all conditions are met
doneBarButton.enabled = true
}
Xcode 9•Swift 4
您可以addTarget
在文本字段中监视控件事件.editingChanged
,并对所有事件使用单个选择器方法:
override func viewDidLoad() {
super.viewDidLoad()
doneBarButton.isEnabled = false
[habitNameField, goalField, frequencyField].forEach({ $0.addTarget(self, action: #selector(editingChanged), for: .editingChanged) })
}
创建选择器方法并guard
结合使用with where
子句(Swift 3/4使用逗号)以确保所有文本字段都不为空,否则返回。Swift
3不需要@objc,但Swift 4却需要:
@objc func editingChanged(_ textField: UITextField) {
if textField.text?.characters.count == 1 {
if textField.text?.characters.first == " " {
textField.text = ""
return
}
}
guard
let habit = habitNameField.text, !habit.isEmpty,
let goal = goalField.text, !goal.isEmpty,
let frequency = frequencyField.text, !frequency.isEmpty
else {
doneBarButton.isEnabled = false
return
}
doneBarButton.isEnabled = true
}
样品
只有当我的布局文件包含一个地图片段时,我才会出现这个错误,就像下面的AndroidV2 api文档中描述的那样,包括IE的变体。在android中指定类名:name属性等。 然而,当我以编程方式IE添加片段时,我不会得到这个错误。当我在代码中创建SupportMapFragment对象并将其添加到布局文件中的“片段容器”元素时。
我想要实现的是创建一个read more按钮,它只会在包装器中的文本中断时显示。 这是我到目前为止的代码: HTML CSS JS 有没有人建议一下如何在这段代码中实现这一点? 先进的谢谢!
我正在使用Swift进行iOS编程,我正在使用此代码移动,但它不起作用。我正确地调用函数,但文本字段不移动。我正在使用自动布局。
问题内容: 如何在mysql中选择仅包含大写字符的字段或不包含任何小写字符的字段? 问题答案: 您可能需要使用区分大小写的排序规则。我相信默认值不区分大小写。例: 然后: 如果您不想在整个表中使用区分大小写的排序规则,则也可以使用其他答案中建议的@kchau子句。 让我们尝试使用不区分大小写的排序规则的表: 这不能很好地工作: 但是我们可以使用子句将名称字段整理为区分大小写的整理:
问题内容: 我正在设计一个iOS应用程序,我希望在iPhone中按回车键时,它可以将我定向到下一个下一个文本字段。 我发现了几个类似的问题,并且都给出了很好的答案,但是它们都恰好在Objective-C中,并且我正在寻找Swift代码,现在这是我到目前为止的想法: 它放置在连接的文件和包含文本字段的UIView的控制器中,但是我不确定那是否是正确的位置。 我基本上是Swift的新手,所以请解释每个
请帮忙。注册页面一直显示此字段是必需的错误。我是初学者谢谢 模型。派克 来自django。数据库导入模型 从django.contrib.auth.models导入AbstractBaseUser, BaseUserManager 类用户管理器(BaseUserManager): 类帐户(AbstractBaseUser): views.py 来自django。快捷方式导入、渲染、重定向 来自dj