web-dev-qa-db-fra.com

Le curseur n'apparaît pas dans UITextView

Quelqu'un peut-il penser à une raison pour laquelle le curseur clignotant ne s'afficherait pas dans une variable UITextView? J'ai un contrôle personnalisé qui est juste une sous-classe de UIView et il a une UITextView, mais le curseur n'apparaît pas lorsqu'il obtient le focus. Le clavier apparaît et le texte apparaît au fur et à mesure que vous tapez, mais il n'y a pas de curseur et je ne comprends pas pourquoi.

Des pensées?...

60
SeanT

Vous avez peut-être changé la couleur de teinte dans votre UITextView personnalisé. Si la teinte est la même que la couleur de fond (normalement le blanc), elle apparaîtra alors invisible.

188
lehn0058

Vous avez peut-être mal défini une contentSize et/ou un cadre pour le composant, de sorte qu'il est trop petit pour être visible ou que le contrôle est en dehors de l'écran. Veuillez aller dans le simulateur à Debug->Color Blended Layers pour voir si ces valeurs sont définies correctement.

MODIFIER:

Avec les nouveaux Xcodes (probablement introduits dans Xcode 6), vous pouvez résoudre ce type de problèmes en cliquant sur "Hiérarchie de vue de débogage" (il s’agit de l’une des icônes de la barre inférieure)

5
Julian Król

J'ai changé la couleur de teinte de tous mes UITextViews et le curseur a commencé à apparaître sur la prochaine construction.

2
Andy Bernard

Le champ de texte affiche le curseur, mais vous ne pouvez pas voir la couleur, simplement parce que la couleur de teinte de votre champ de texte est définie par défaut, comme dans mon cas, il s'agissait de . lien couleur de votre souhait. Reportez-vous à l'image ci-jointe.

 enter image description here

2
Kunal Gupta

Dans mon cas, j'ai appelé becomeFirstResponder dans une méthode viewDidLoad. J'ai déplacé l'appel dans viewDidAppear et cela a fonctionné pour moi.

1
Vladimir Vlasov

Une solution de contournement simple semble fonctionner en introduisant un délai puis en appelant firstResponder, comme suit:

-(void)begin{

    [self performSelector:@selector(first) withObject:nil afterDelay:0.01f];
}
-(void)first{

    [tf becomeFirstResponder];
}
1
Johnny Rockex

La solution ci-dessus n'a pas fonctionné dans mon cas. Le problème dans mon cas est que UIView qui agit comme curseur a isOpaque défini sur false lorsque UITableViewCell's selectionStyle est tout sauf none. Cela semble se produire uniquement dans des conditions de concurrence que je n'ai pas encore atteintes. 

FWIW voici comment j'ai débogué ceci:

  1. sélectionnez votre UITextFieldView
  2. ouvrez la hiérarchie de la vue de débogage. Vous devriez voir la UIView qui représenterait le curseur à la position correcte, mais elle n'apparaît pas dans l'interface utilisateur.
  3. faites un clic droit sur la variable UIView du curseur et sélectionnez "Imprimer la description ...". La description indique OPAQUE=NO

Malheureusement, la classe UITextSelectionView à laquelle appartient cette UIView est privée et, par conséquent, il n'existe aucun moyen non hacky de mettre à jour par programme isOpaque.

Cela ne semble pas être un problème dans chaque mise en œuvre, cependant, voici la relation entre mes points de vue. 

Mon délégué en vue texte

extension FooViewController: UITextViewDelegate {
    private func updateSelection(selectedIndex indexPath: IndexPath) {
        if let oldSelected = self.table.indexPathForSelectedRow {
            tableDelegate.tableView(table, didDeselectRowAt: oldSelected)
        }
        tableDelegate.tableView(table, didSelectRowAt: indexPath)
    }

    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
        guard let rowCell = getParentCell(forTextView: textView), // loops through table row cells
            !rowCell.isSelected,
            let indexPath = self.table.indexPath(for: rowCell)
            else { return true }

        updateSelection(selectedIndex: indexPath)
        return false
    }

et mon délégué de table:

class TableViewDelegate: NSObject, UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {       
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableView.ScrollPosition.none)
    }
}
0
TolkienWASP

Pour moi, le problème a été causé par l'intégration d'une UITextField dans une UIToolbar. Une fois que j'ai remplacé le conteneur pour une simple UIView, le curseur a fonctionné à nouveau.

0
FD_