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)
}
}
在这里,我们使用键访问搜索栏的元素。
在 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
是
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)
}
}
在这里,我们使用键访问搜索栏的元素。