swift - UISearchBar.value for key 在swift中做了什么?
问题描述
在快速使用 UITableView 和 UISearchBar 时,我试图找到一种方法来在用户搜索某些内容然后在表格视图中滚动时保持搜索栏上的取消按钮处于启用状态,这样他们就不必单击两次来取消搜索。辞职第一响应者(或结束搜索栏上的编辑)的默认行为将使取消按钮变灰,但我想保持启用它,所以在 Stackoverflow 我找到了如何做到这一点,但我找不到答案在线了解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
s 都符合NSKeyValueCoding 协议参考
valueForKey:
是一种KVC方法。它适用于任何NSObject
类以及符合上述协议的任何其他类。valueForKey:
允许您使用字符串作为其名称来访问属性。因此,例如,如果我有一个Account
带有 property 的类number
,我可以执行以下操作:
let myAccount = Account(number: 12)
myAccount.value(forKey: "number")
由于它是运行时检查,因此无法确定返回类型是什么。所以你必须像这样手动投射它:
let number = myAccount.value(forKey: "number") as? Int
我不打算在这里解释 downcast 和 optionals
因此,您只需知道其方法的确切名称(可以通过简单的逆向工程轻松找到),就可以访问符合的对象的任何属性。 NSKeyValueCoding
此外,还有一个类似的方法performSelector
可以让您执行对象的任何功能
⚠️ 但是请注意,如果您触摸系统的私有变量或函数,Apple 将拒绝您的应用程序。(如果他们发现了!)
⚠️ 另外,请注意,其中任何一个都可以在不通知的情况下重命名,并且您的应用将面临未定义的行为。
推荐阅读
- javascript - 用 Javascript 合并两个数组对象
- java - 字符串中出现字母'' - 错误的代码和输出
- go - 为什么 Go 中的 io.Writer 没有 NopCloser?
- python - BeautifulSoup:我如何从一个
- php - Woocommerce save order items - problem with cycle
- reactjs - Pass props inside function on firebase.utils.js
- c# - Connect to SocketVoiceChannel (discord.NET)
- laravel - 在 laravel 的主分类中显示子分类产品
- json - 无法从颤振中的 jsonDecoded 变量中提取密钥
- javascript - 在 JavaScript 中定义 IndexedDB 存储的类与函数