2015-09-16 7 views
31

У меня есть текстовое поле со скрытой клавиатурой (так как я использую его с bluetooth). Однако в iOS9 панель быстрого доступа продолжает появляться.Как скрыть ярлык в iOS9

Есть ли способ скрыть это тоже?

Большое вам спасибо!

ответ

53

Вы можете передать свое текстовое поле вместо userNameTextField, для которого вы хотите удалить ярлык.

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

Да, префиксом с 'is_grater__or_equal_than (9.0)' или он будет врезаться в более низких версиях –

+0

@Dheeraj - как бы это должно быть сделано в коде Xamarin.iOS C#? Внутри этой структуры InputAssistanceItem, по-видимому, доступен только для чтения (http://stackoverflow.com/questions/37442203/xamarin-ios-remove-shortcut-bar-from-picker) – jbyrd

+0

Пожалуйста, скажите мне, где нам нужно использовать это 3 строки – Balu

12

В Swift 2.0

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

Просто FYI, вам нужно называть это на каждом UITextView или UITextField (в основном, все, что появляется на клавиатуре), поскольку каждое поле ввода имеет собственный UITextInputAssistantItem. – TenaciousJay

9

Я была такая же проблема. И так начинается поиск SO. Таким образом, выше помог мне, но в целом, «если iOS9 вещь» может быть лучше оформлена так:

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

К счастью, я создал подкласс в UITextField (CHTextField) и был в использовать везде. Поэтому было очень легко исправить это в чрезмерном методе «init».

Надеюсь, это поможет.

3

Просто, чтобы рассказать о других ответах здесь. Я объединил некоторый код Swift 2.0, который будет проходить через все подпункты данного представления и отключить UITextInputAssistantItems для всех UITextFields и UISearchBars.

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() и передаю в self.view, как hideTheAssistantBar(self.view).

Я действительно сделал шаг вперед для своих нужд и добавил эту функцию в класс-помощник, который я использую для общего кода. Поэтому внутри моей функции viewDidLoad() я на самом деле просто вызываю helper.hideTheAssistantBar(self.view), а затем мне не нужно помещать эту функцию в каждый файл.

Надеюсь, это поможет кому-то прийти к поиску простого способа удалить панель помощника из всех UITextFields и UISearchBars одним махом.

Благодаря @Arkader для быстрого кода, чтобы рекурсивно найти все subviews. Swift List Subviews

6

В качестве альтернативы просто создайте расширение для UITextField в Swift 2.0, как это.

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(); 
} 
5

Самый простой способ сделать это для всех текстовых полей в вашем приложении, чтобы создать категорию на UITextInputAssistantItem и переопределить методы получения для leadingBarButtonGroups и trailingBarButtonGroups как это:

@implementation UITextInputAssistantItem (RemoveBars) 

- (NSArray<UIBarButtonItemGroup *> *)leadingBarButtonGroups 
{ 
    return @[]; 
} 

- (NSArray<UIBarButtonItemGroup *> *)trailingBarButtonGroups 
{ 
    return @[]; 
} 

@end 

Это работало для меня на iOS 9.x и 8.x, нет необходимости в каком-либо условном коде.

Будьте осторожны с этим, хотя, это перекрывает эти свойства ВСЕМУ, который использует UITextInputAssistantItem

+1

Кажется, это самый простой способ. Прекрасно работает на 9.3. – nickdnk

+1

На самом деле это единственный способ, который я нашел, чтобы это не просачивалось. – Eagle11

+0

Этот подход не утечки памяти и, вероятно, лучший ответ на данный момент. – AndyTang

Смежные вопросы