首页 > 解决方案 > 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 }
        }
    }

提前致谢。

标签: swiftuisearchbar

解决方案


UISearchBar是一个子类

UIView-> UIResponder->NSObject

并且所有NSObjects 都符合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 将拒绝您的应用程序。(如果他们发现了!)

⚠️ 另外,请注意,其中任何一个都可以在不通知的情况下重命名,并且您的应用将面临未定义的行为。


推荐阅读