【问题标题】:How to hide the shortcut bar in iOS9iOS9如何隐藏快捷栏
【发布时间】:2015-12-12 22:12:28
【问题描述】:

我有一个带有隐藏键盘的文本字段(因为我将它与蓝牙一起使用)。但是,在iOS9中,快捷栏一直出现。

有没有办法隐藏它?

非常感谢!

【问题讨论】:

    标签: uitextfield ios9


    【解决方案1】:

    您可以传递您的文本字段名称来代替您要删除快捷栏的 userNameTextField

    UITextInputAssistantItem* item = [userNameTextField inputAssistantItem];
    item.leadingBarButtonGroups = @[];
    item.trailingBarButtonGroups = @[];
    

    【讨论】:

    • 是的,前缀为is_grater__or_equal_than(9.0),否则在较低版本中会崩溃
    • @Dheeraj - 这将如何在 Xamarin.iOS C# 代码中完成?在该框架内,InputAssistanceItem 似乎是只读的 (stackoverflow.com/questions/37442203/…)
    • 请任何人告诉我我们需要在哪里使用这 3 行
    • Running Leaks Instrument 似乎表明此代码到处泄漏。
    • 请注意,正如它所说的hereautocorrectionType 也必须设置为.no,否则它仍然会显示建议
    【解决方案2】:

    在 Swift 2.0 中

    if #available(iOS 9.0, *) {
        let item : UITextInputAssistantItem = yourTextView.inputAssistantItem
        item.leadingBarButtonGroups = []
        item.trailingBarButtonGroups = []
    } else {
      // Fallback on earlier versions
    }
    

    【讨论】:

    • 仅供参考,您需要在每个 UITextView 或 UITextField(基本上是弹出键盘的任何内容)上调用它,因为每个输入字段都有自己的 UITextInputAssistantItem。
    【解决方案3】:

    我有同样的问题。于是开始搜索 SO。所以上面的内容帮助了我,但整个“如果 iOS9 的事情”可能最好这样框定:

    if ([self respondsToSelector:@selector(inputAssistantItem)]) {
        // iOS9.
        UITextInputAssistantItem* item = [self inputAssistantItem];
        item.leadingBarButtonGroups = @[];
        item.trailingBarButtonGroups = @[];
    }
    

    幸运的是,我创建了一个 UITextField 的子类 (CHTextField),并且到处都在使用。因此,在覆盖的“init”方法中解决这个问题是一个非常容易的解决方法。

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      只是在这里扩展其他答案。我拼凑了一些 Swift 2.0 代码,这些代码将遍历给定视图的所有子视图并禁用所有 UITextFields 和 UISearchBars 的 UITextInputAssistantItems。

      func hideTheAssistantBar(view:UIView) {
          //Check this view
          for case let textField as UITextField in view.subviews {
              let item : UITextInputAssistantItem = textField.inputAssistantItem
              item.leadingBarButtonGroups = []
              item.trailingBarButtonGroups = []
          }
          for case let searchBar as UISearchBar in view.subviews {
              let item : UITextInputAssistantItem = searchBar.inputAssistantItem
              item.leadingBarButtonGroups = []
              item.trailingBarButtonGroups = []
          }
      
          //Now find this views subviews
          let subviews = view.subviews
      
          for subview : AnyObject in subviews {
              if subview.isKindOfClass(UIView) {
                  hideTheAssistantBar(subview as! UIView)
              }
          }
      }
      

      然后你可以调用这个函数,传入你想要开始的任何视图。我在我的 ViewDidLoad() 方法中调用它,并像 hideTheAssistantBar(self.view) 一样传入 self.view

      我实际上更进一步满足了我的需求,并将这个函数添加到我用于公共代码的帮助器类中。因此,在我的viewDidLoad() 函数中,我实际上只是调用了helper.hideTheAssistantBar(self.view),然后我不必将该函数放入每个文件中。

      希望这有助于寻找一种简单的方法从所有 UITextFields 和 UISearchBars 中一次性删除助手栏的人。

      感谢@Arkader 提供递归查找所有子视图的快速代码。 Swift List Subviews

      【讨论】:

        【解决方案5】:

        或者,只需像这样在 Swift 2.0 中为 UITextField 创建一个扩展。

        extension UITextField
        {
            public func hideAssistantBar()
            {
                if #available(iOS 9.0, *) {
                   let assistant = self.inputAssistantItem;
                    assistant.leadingBarButtonGroups = [];
                    assistant.trailingBarButtonGroups = [];
                }
            }
        }
        

        然后你可以在任何你喜欢的文本字段上调用 ​​hideAssistantBar()。

        @IBOutlet weak var myTextField: UITextField?;
        
        override public func viewDidLoad() {
            super.viewDidLoad();
        
            myTextField?.hideAssistantbar();
        }
        

        【讨论】:

          【解决方案6】:

          对应用中的所有文本字段执行此操作的一种简单方法是在 UITextInputAssistantItem 上创建一个类别并覆盖 leadingBarButtonGroupstrailingBarButtonGroups 的 getter,如下所示:

          @implementation UITextInputAssistantItem (RemoveBars)
          
          - (NSArray<UIBarButtonItemGroup *> *)leadingBarButtonGroups
          {
              return @[];
          }
          
          - (NSArray<UIBarButtonItemGroup *> *)trailingBarButtonGroups
          {
              return @[];
          }
          
          @end
          

          这在 iOS 9.x 和 8.x 上对我有用,不需要任何条件代码。

          请注意这一点,这会覆盖使用 UITextInputAssistantItem

          EVERYTHING 的那些属性

          【讨论】:

          • 这似乎是迄今为止最简单的方法。在 9.3 上运行良好。
          • 这实际上是我发现的唯一不会泄漏的方法。
          • 这种方法不会泄漏内存,可能是目前更好的答案。
          【解决方案7】:

          Swift 3.04.0

          self.textField.inputAssistantItem.leadingBarButtonGroups.removeAll()
          self.textField.inputAssistantItem.trailingBarButtonGroups.removeAll()
          

          【讨论】:

            【解决方案8】:

            只是基于 Pranavan 发布的内容,因为在使用 Xcode 11 的 iOS 12 或 13 中将条形按钮组设置为空数组似乎不起作用。

            let inputAssistantItem = textFieldForTypingText.inputAssistantItem
            inputAssistantItem.leadingBarButtonGroups.removeAll()
            inputAssistantItem.trailingBarButtonGroups.removeAll()
            

            我把上面的代码放在 viewDidLoad() 函数中。

            你也可以给用户选项:

            inputAssistantItem.allowsHidingShortcuts = true
            

            在让用户隐藏它的情况下,如果文本字段再次成为第一响应者,他们将不得不再次隐藏它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-07-23
              • 2015-12-21
              • 1970-01-01
              • 1970-01-01
              • 2020-07-07
              • 1970-01-01
              相关资源
              最近更新 更多