2017-01-09 1 views
1

Nouveau sur Swift.Interdire l'interaction de l'utilisateur avec l'interface utilisateur sauf le clavier lors de la modification du champ de texte

Lorsqu'un utilisateur clique sur un champ de texte pour commencer à taper, existe-t-il un moyen de désactiver toute interaction de l'utilisateur autre que de taper dans ce champ de texte? Je le veux afin que l'utilisateur est incapable de cliquer en dehors du champ de texte, et devrait appuyer sur la touche de retour pour rejeter le clavier, où l'interaction de l'utilisateur est à nouveau activée (j'ai la pièce de clavier de licenciement mis en place).

Je sais que la fonction isUserInteractionEnabled peut arrêter toute interaction, mais je veux quand même que l'utilisateur puisse interagir avec le clavier.

Merci

+0

Ne devrait pas être automatique, vous devez le coder comme ça, en désactivant par programme toutes les autres fonctionnalités. –

+0

à droite. C'est ce que je me demande comment faire. Je sais userInteractionEnabled peut arrêter toute interaction mais je veux toujours que l'utilisateur puisse interagir avec le clavier – brownmamba

+0

Par exemple, pour un bouton d'interface utilisateur, vous devriez faire yourButtonName.isEnabled = false –

Répondre

0

Le comportement que vous décrivez est peut être accompli en manipulant la valeur booléenne isEnabled si les éléments UI. Il y a quelques étapes pour rendre ceci facile et convivial.

Juste bonnes pratiques, et non requis pour cet exemple, mais je tiens à faire l'extension du MyViewController, inscrire/désinscrire aux notifications de clavier et ainsi de suite en elle, comme ceci:

import Foundation 
import UIKit 

extension MyViewController {    

    //MARK: Subscribing/Unsubribing to NotificationCenter. 
    func subcribeToKeyboardNotifications(){  
     NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
    } 

    func unsubscribeToKeyboardNotifications(){ 
     NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
    } 

    //MARK: Screen manipulation methods, to move the UIView up when the bottom text field is editing. 
    func keyboardWillShow(_ notification: Notification) { 
     if bottomTextField.isEditing { 
      view.frame.origin.y = getKeyboardHeight(notification) * -1 
     } 
    } 

    func keyboardWillHide(_ notification: Notification) { 
     if bottomTextField.isEditing { 
      view.frame.origin.y = 0 
     } 
    } 

    //MARK: Value returning method to calculate keyboard height. 
    private func getKeyboardHeight(_ notification: Notification) -> CGFloat { 
     let userInfo = (notification as NSNotification).userInfo! 
     let keyboardSize = userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue 
     return keyboardSize.cgRectValue.height 
    } 
} 

Ensuite, Dans MyViewController, je règle le clavier sur resignToFirstResponder() lorsque la touche de retour est appuyée, et je m'assure de régler mon UITextFieldDelegates.

import Foundation 
import UIKit 

class MyViewController: UIViewController, UITextFieldDelegate { 
    @IBOutlet weak var someButton: UIButton! 
    @IBOutlet weak var topTextField: UITextField! 
    @IBOutlet weak var bottomTextField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //Set the delegates to self, it this example. 
     topTextField.delegate = self 
     bottomTextField.delegate = self 
     enableUIElements(true) 
    } 

    //Delegate function to type stuff into the text field. 
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     enableUIElements(false) 
     var newText = textField.text! as NSString 
     newText = newText.replacingCharacters(in: range, with: string) as NSString 
     let textSize: CGSize = newText.size(attributes: [NSFontAttributeName: textField.font!]) 
     return textSize.width < textField.bounds.size.width 
    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() //Dismiss the keyboard. 
     enableUIElements(true) //enable the UI elements. 
     return true 
    } 

    //Create a function to enable/disable UI elements. 
    func enableUIElements(_ enable: Bool){ 
     someButton.isEnabled = enable 
     //TODO: add other elements here. 
    } 
} 

Notez que la dernière fonction !!! Utilisez-le pour activer/désactiver d'autres éléments lorsque le clavier est actif, comme je l'ai montré.

Cela devrait vous rendre où vous devez aller :)

1

Ainsi, la première idée, qui est venu me voir est invalidante chaque élément d'interface utilisateur dans votre vue pendant que vous vous concentrez sur l'instance UITextField.

Créez une fonction qui obtiendra un élément d'interface utilisateur en tant qu'argument (UITextField par ex). Dans le corps de la fonction, commencez à vérifier chaque élément de l'interface utilisateur et désactivez cycliquement tout le monde, ce qui ne sera pas égal à l'argument passé. Vous pouvez vérifier votre champ de texte pour le type et le texte en plus.

est ici le projet du corps de la fonction:

func disableAll(exceptInput element: UITextField) { 
    for item in self.view.subviews { 
     if item != element { 
      item.isUserInteractionEnabled = false 
     } else { 
      item.isUserInteractionEnabled = true 
     } 
    } 
} 

Et effectuer cette méthode dans l'action du champ de texte, par ex. dans le onDidStart.

Et, bien sûr, ne pas oublier d'activer tous les éléments pour l'interaction de l'utilisateur. Le code est simple:

func enableAll() { 
    for item in self.view.subviews { 
     item.isUserInteractionEnabled = true 
    } 
} 

Cette méthode vous pouvez effectuer sur le onDidEnd IBAction pour chaque UITextField. La dernière étape est nécessaire si vous voulez exécuter le comportement normal de l'application.

+0

C'est très proche de ce que j'essaie d'atteindre. Je travaille avec des cellules de vue table et j'ai un élément textField pour contrôler toutes les cellules. Ainsi, avec votre réponse, l'utilisateur peut appuyer sur textField d'une autre cellule et l'interaction sera activée. Existe-t-il un moyen de se concentrer uniquement sur textField d'une cellule? Donc, ils ne peuvent même pas cliquer sur d'autres textFields? – brownmamba