UISearchBar.value for key 在 swift 中有什么作用?

What does UISearchBar.value for key do in swift?

在 swift 中使用 UITableView 和 UISearchBar 时,我试图找到一种方法,当用户搜索内容然后在 table 视图中滚动时,使搜索栏上的取消按钮保持启用状态,因此他们不必点击两次即可取消搜索。退出第一响应者(或结束搜索栏上的编辑)的默认行为将使取消按钮变灰,但我想保持启用状态,所以在 Whosebug 上我找到了如何执行此操作,但我找不到答案在线了解 searchBar.value(forKey: "cancelButton") 在下面的代码中做了什么。显然,它以某种方式创建了对搜索栏上取消按钮的引用,但我不明白 .value 的作用(因为我是 swift 的新手),以及“cancelButton”键的来源。看了func value(forKey key: String)文档,还是没看懂。如果有人能解释这是在做什么就太好了。

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        searchBar.resignFirstResponder()
        // If the user scrolls, keep the cancel button enabled
        if let cancelButton = searchBar.value(forKey: "cancelButton") as? UIButton {  // <-- This line
            if searchBar.text != "" { cancelButton.isEnabled = true }
            else { searchBar.showsCancelButton = false }
        }
    }

提前致谢。

UISearchBar

的子class

UIView -> UIResponder -> NSObject

并且所有 NSObject 都符合 NSKeyValueCoding Protocol Reference

valueForKey: 是一种 KVC 方法。它适用于任何 NSObject class 以及符合上述协议的任何其他内容。 valueForKey: 允许您使用名称字符串访问 属性。因此,例如,如果我有一个 Account class 和一个 属性 number,我可以执行以下操作:

let myAccount = Account(number: 12)
myAccount.value(forKey: "number")

由于是运行时检查,所以不能确定return类型是什么。所以你必须像这样手动投射它:

let number = myAccount.value(forKey: "number") as? Int

我不打算在这里解释 downcast 和 optionals

所以你可以访问 any 属性 一个符合 NSKeyValueCoding 的对象,只要知道它的方法的确切名称(可以很容易地找到一个简单的逆向工程)。

此外,还有一个类似的方法叫做performSelector,可以让你执行对象的任何功能

⚠️ 但请注意,如果您触摸系统的私有变量或函数,Apple 将拒绝您的应用。 (如果他们发现了!)

⚠️ 另外请注意,任何这些都可以在不另行通知的情况下重命名,您的应用程序将面临未定义的行为。

我 运行 遇到了与您搜索列表相同的问题,但我意识到您可以改为实现 UITextfields...

使用 didReturn 执行 textfield.resignFirstResponder() 并在它辞职时使用 textfield.value 获取值以搜索列表。

在 iOS 12 或以下的搜索栏中,要访问元素,您可以使用键值来访问元素。喜欢这个功能-

private func configureSearchBar() {
    searchBar.barTintColor = Color.navBarColor
    searchBar.makeRounded(cornerRadius: 5, borderWidth: 1, borderColor: Color.navBarColor)
    searchBar.placeholder = searchBarPlaceholderText
    searchBar.setImage(Images.search_white, for: .search, state: .highlighted)
    searchBar.setImage(Images.green_check, for: .clear, state: .normal)

    if let textField = searchBar.value(forKey: "searchField") as? UITextField {
        textField.textColor = .white
        
        textField.attributedPlaceholder = NSAttributedString(string: textField.placeholder ?? "", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])
        
        let leftSideImage = textField.leftView as? UIImageView
        leftSideImage?.tintColor = .white
    }
    
    if let cancelButton = searchBar.value(forKey: "cancelButton") as? UIButton {
        cancelButton.setTitleColor(.white, for: .normal)
    }
}

在这里,我们使用键访问搜索栏的元素。