2015-09-16 10 views

risposta

53

È possibile passare il nome di campo di testo al posto di userNameTextField per il quale si desidera rimuovere barra dei collegamenti.

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

Sì, prefisso con uno 'is_grater__or_equal_than (9.0)' o andrà in crash nelle versioni inferiori –

+0

@Dheeraj - come sarebbe questo può essere fatto nel codice Xamarin.iOS C#? All'interno di questo framework, InputAssistanceItem sembra essere di sola lettura (http://stackoverflow.com/questions/37442203/xamarin-ios-remove-shortcut-bar-from-picker) – jbyrd

+0

Per favore qualcuno può dirmi dove dobbiamo usare questo 3 righe – Balu

12

In Swift 2,0

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

Solo FYI, è necessario chiamare questo su ogni UITextView o UITextField (in pratica qualsiasi cosa che si apre alla tastiera) poiché ogni campo di input ha il proprio UITextInputAssistantItem. – TenaciousJay

9

Ho avuto lo stesso problema. E così inizia una ricerca di SO. Così il sopra mi ha aiutato, ma nel complesso, "se iOS9 cosa" potrebbe essere meglio inquadrato in questo modo:

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

Fortunatamente, avevo creato una sottoclasse di un UITextField, (CHTextField) ed è stato in usare ovunque Quindi è stata una soluzione molto semplice per capirlo nel metodo "init" sovradimensionato.

Spero che aiuti.

3

Solo per espandere le altre risposte qui. Ho messo insieme un po 'di codice Swift 2.0 che eseguirà il ciclo di tutte le visualizzazioni secondarie di una determinata vista e disabiliterà UITextInputAssistantItems per tutti gli UITextFields e 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) 
     } 
    } 
} 

È quindi possibile chiamare questa funzione passando in qualsiasi visualizzazione si desideri iniziare. Lo chiamo all'interno del mio metodo ViewDidLoad() e passo in self.view come hideTheAssistantBar(self.view).

In realtà ho fatto un ulteriore passo avanti per le mie esigenze e ho aggiunto questa funzione a una classe helper che utilizzo per codice comune. Pertanto all'interno della mia funzione viewDidLoad() in realtà mi limito a chiamare helper.hideTheAssistantBar(self.view) e quindi non devo mettere quella funzione in ogni file.

Spero che questo aiuti qualcuno a venire a cercare un modo semplice per rimuovere la barra assistente da tutti i campi UITextFields e UISearchBars in un solo colpo.

Grazie a @Arkader per il codice rapido per trovare in modo ricorsivo tutte le sottoview. Swift List Subviews

6

In alternativa, è sufficiente creare un'estensione per UITextField in Swift 2.0 come questo.

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

Quindi puoi chiamare hideAssistantBar() su qualsiasi campo di testo che ti piace.

@IBOutlet weak var myTextField: UITextField?; 

override public func viewDidLoad() { 
    super.viewDidLoad(); 

    myTextField?.hideAssistantbar(); 
} 
5

Un modo semplice per fare questo per tutti i campi di testo nella vostra applicazione è quello di creare una categoria a UITextInputAssistantItem e sovrascrivere i getter per leadingBarButtonGroups e trailingBarButtonGroups come questo:

@implementation UITextInputAssistantItem (RemoveBars) 

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

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

@end 

Questo ha funzionato per me su iOS 9.xe 8.x, non è necessario alcun codice condizionale.

stare attenti con questo, però, questo sostituisce quelle proprietà per TUTTO che utilizza UITextInputAssistantItem

+1

Questo sembra di gran lunga l'approccio più semplice. Funziona bene su 9.3. – nickdnk

+1

Questo è in realtà l'unico modo che ho trovato per fare ciò che non colerà. – Eagle11

+0

Questo approccio non perde memoria ed è probabilmente la risposta migliore per ora. – AndyTang

Problemi correlati