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?...
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.
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)
J'ai changé la couleur de teinte de tous mes UITextViews et le curseur a commencé à apparaître sur la prochaine construction.
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.
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];
}
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:
UITextFieldView
UIView
qui représenterait le curseur à la position correcte, mais elle n'apparaît pas dans l'interface utilisateur.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)
}
}
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.