【问题标题】:What does UISearchBar.value for key do in swift?UISearchBar.value for key 在swift中做了什么?
【发布时间】:2020-08-14 19:36:21
【问题描述】:

当在 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 }
        }
    }

提前致谢。

【问题讨论】:

  • stackoverflow.com/questions/4489684/… 因为UISearchBar 有一个名为cancelButton 的“隐藏”属性。旁注,您正在访问一个私有变量,名称是通过逆向工程找到的。它可能会在下一个 iOS 版本中重命名,或者可能会被 AppStore 拒绝。
  • 无论您是搜索还是取消搜索,您都希望取消按钮始终处于启用状态吗?对吗?

标签: swift uisearchbar


【解决方案1】:

UISearchBar 是一个子类

UIView -> UIResponder -> NSObject

并且所有NSObjects 都符合NSKeyValueCoding Protocol Reference

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

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

由于它是运行时检查,因此无法确定返回类型是什么。所以你必须手动投射它:

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

这里就不解释downcast和options了

因此,您只需知道其方法的确切名称(可以通过简单的逆向工程轻松找到),就可以访问符合 NSKeyValueCoding 的对象的任何属性。

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

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

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

【讨论】:

    【解决方案2】:

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

    使用didReturntextfield.resignFirstResponder() 并在它辞职时使用textfield.value 来搜索一个列表。

    【讨论】:

      【解决方案3】:

      在 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)
          }
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 2018-08-12
        • 1970-01-01
        • 2021-09-09
        相关资源
        最近更新 更多