📜  ios 的输入配置 (1)

📅  最后修改于: 2023-12-03 15:01:26.442000             🧑  作者: Mango

iOS 的输入配置

在 iOS 上,输入是用户与设备沟通的重要方式之一。iOS 提供了各种输入的方式和配置,使得应用程序能够更好的与用户交互。本文将介绍 iOS 上的输入配置。

键盘

在 iOS 上,我们可以使用系统自带的键盘或者自定义键盘来获取用户的输入。

系统自带键盘

iOS 提供了多种系统键盘类型,包括默认键盘,数字键盘,电话号码键盘,URL 键盘等等。我们可以通过设置 UITextField 或 UITextView 的 keyboardType 属性来指定键盘类型。

textField.keyboardType = .default
textView.keyboardType = .numberPad
自定义键盘

如果需要自定义键盘,iOS 提供了协议 UIKeyInputUIInputView

UIKeyInput 协议定义了键盘的基本行为。

protocol UIKeyInput : UITextInputTraits {
    var hasText: Bool { get }
    func insertText(_ text: String)
    func deleteBackward()
}

我们需要实现该协议中的方法,并将实现该协议的类作为键盘的输入视图。

class CustomKeyboard: UIView, UIInputViewAudioFeedback {

    // 实现 UIKeyInput 协议的方法

    var enableInputClicksWhenVisible: Bool {
        return true
    }
}

textField.inputView = CustomKeyboard()
输入限制

在 iOS 开发中,通常需要限制用户输入的内容,我们可以使用以下方式实现输入限制:

字符数限制

使用 UITextField 或者 UITextViewmaxLength 属性,限制用户输入的字符数。

textField.maxLength = 10
textView.maxLength = 200
正则表达式限制

正则表达式可以实现更加细粒度的输入限制。我们可以使用 UITextFieldDelegateUITextViewDelegate 中的 shouldChangeCharactersIn 方法,来判断输入是否符合正则表达式要求。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    let pattern = "^\\d*$"
    let regex = try! NSRegularExpression(pattern: pattern, options: [])
    return regex.matches(in: newString, options: [], range: NSRange(location: 0, length: newString.count)).count > 0
}
输入提示

在用户输入的过程中,提供输入提示可以减少用户输入错误的概率,并提高用户体验。我们可以使用 UISearchControllerUIAutocompleteTextField 或者自定义实现方式来实现输入提示。

UISearchController

UISearchController 可以用来实现搜索输入提示。我们需要设置搜索框的 searchResultsUpdater 属性,并在实现 updateSearchResults(for:) 方法中更新搜索结果。同时,我们还需要实现搜索框的 textDidChange(_:) 方法,来更新搜索提示。

class ListViewController: UIViewController, UISearchResultsUpdating {

    let searchController = UISearchController(searchResultsController: nil)
    var searchResults = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "Search"

        navigationItem.searchController = searchController
        definesPresentationContext = true
    }

    func updateSearchResults(for searchController: UISearchController) {
        if let searchText = searchController.searchBar.text, !searchText.isEmpty {
            searchResults = ["Result 1", "Result 2", "Result 3"]
        } else {
            searchResults = []
        }

        // 更新搜索提示
    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        // 更新搜索提示
    }
}
UIAutocompleteTextField

UIAutocompleteTextField 可以用来实现自动完成输入提示。我们需要设置 UIAutocompleteTextFieldDelegate 协议,并在实现 textField(_:shouldChangeCharactersIn:replacementString:)textFieldDidBeginEditing(_:) 方法中更新输入提示。

class AutocompleteTextField: UITextField, UIAutocompleteTextFieldDelegate {

    var autocompleteOptions = ["Option 1", "Option 2", "Option 3"]

    override func willMove(toSuperview newSuperview: UIView?) {
        super.willMove(toSuperview: newSuperview)

        autocompleteTextFieldDelegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // 更新输入提示
        return true
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        // 更新输入提示
    }
}
自定义实现

我们还可以通过在输入框下方添加提示框的方式来实现输入提示。我们需要监听输入框的 textDidChange 事件,动态更新提示框内容,并设置提示框的 isHidden 属性来控制其显示或者隐藏。

class InputViewController: UIViewController {

    let textField = UITextField()
    let promptView = UIView()
    let promptLabel = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

        promptView.addSubview(promptLabel)
        view.addSubview(promptView)
    }

    @objc func textFieldDidChange(_ textField: UITextField) {
        // 更新输入提示
    }
}
小结

iOS 上的输入配置丰富多样,包括系统自带键盘、自定义键盘、输入限制、输入提示等等。我们可以根据具体需求选择适合的实现方式。