2009-10-28 4 views
36

Possible en double:
How disable Copy, Cut, Select, Select All in UITextViewUITextView désactiver la sélection de texte

Je vais avoir du mal à obtenir le UITextView pour désactiver la sélection du texte.

J'ai essayé:

canCancelContentTouches = YES; 

J'ai essayé et écrasez subclassing:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 

(Mais qui est appelé seulement après la sélection)

- (BOOL)touchesShouldCancelInContentView:(UIView *)view; 

(I ne vois pas cela se faire virer du tout)

- (BOOL)touchesShouldBegin:(NSSet *)touches 
       withEvent:(UIEvent *)event 
      inContentView:(UIView *)view; 

(je ne vois pas que se soit mis le feu)

Qu'est-ce que je manque?

+2

Comme il est impossible d'ajouter des réponses à ceci: notez la Meilleure réponse ici (IMHO) est en fait un commentaire par Alexander: depuis iOS 7, il y a un @property (nonatomic, getter = isSelectable) BOOL sélectionnable NS_AVAILABLE_IOS (7_0) – Epaga

+0

J'ai eu la question rouverte et ajouté 'sele ctable' comme une bonne réponse. Yay! –

Répondre

73

Problème How disable Copy, Cut, Select, Select All in UITextView a une solution viable à ce que je viens de mis en œuvre et Verified:

Sous UITextView et écraser canBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder { 
    return NO; 
} 

Notez que e Désactive les liens et autres contenus textuels pouvant être tappés.

+4

Cette réponse devrait être acceptée à mon humble avis. – Craimasjien

+0

Merci, cela a fonctionné pour mes besoins. – masgar

+0

La réponse de James M fonctionne mieux. – jowie

5

Si vous souhaitez simplement empêcher son édition, définissez la propriété "editable" de UITextView sur NO/False.

Si vous essayez de le laisser modifiable mais non sélectionnable, cela va être difficile. Vous devrez peut-être créer une vue de texte cachée dans laquelle l'utilisateur peut taper et puis UITextView observera cette vue de texte cachée et se peuplera avec le texte de textview.

+1

Je ne veux pas que ce soit modifiable, ou sélectionnable. – dizy

+0

Avez-vous besoin de faire défiler? – TechZen

+1

Oui, j'en ai besoin pour faire défiler. – dizy

1

Avez-vous essayé de définir userInteractionEnabled sur NO pour votre UITextView? Mais vous perdriez aussi le défilement.

Si vous avez besoin de défilement, ce qui est probablement la raison pour laquelle vous avez utilisé un UITextView et non un UILabel, alors vous devez faire plus de travail. Vous devrez probablement passer outre canPerformAction:withSender: pour revenir NO pour les actions que vous ne souhaitez pas autoriser:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    switch (action) { 
     case @selector(paste:): 
     case @selector(copy:): 
     case @selector(cut:): 
     case @selector(cut:): 
     case @selector(select:): 
     case @selector(selectAll:): 
     return NO; 
    } 
    return [super canPerformAction:action withSender:sender]; 
} 

Pour plus, UIResponderStandardEditActions.

+1

J'ai mentionné que j'ai déjà essayé :) canPerform ne sera pas appelé avant que vous ayez fait la sélection – dizy

+0

Downvote: cela n'empêchera pas la coupe/copier/définir la barre d'outils d'apparaître - il existe de meilleures solutions répertoriées sur cette page. – Gerard

9

Il semble que ce que vous voulez réellement est un UILabel géant dans un UIScrollView, et non un UITextView.

mise à jour: si vous êtes sur une version plus récente d'iOS UILabel dispose désormais d'une propriété lignes:

Multiple lines of text in UILabel

+1

Oui je suppose. Sera la prochaine chose que je fais si je ne comprends pas cela. – dizy

+0

thanx mec, je ne sais pas à propos de dizy, mais j'avais besoin d'un UILabel. –

+0

UILabel empêchera les sauts de ligne. Vous voulez un UITextView sans interaction utilisateur activée ... et vous voulez que cela soit dans un UIScrollView. Vous pouvez également afficher un UIWebView transparent avec votre texte dans un textView dans UIWebView (utilisez simplement loadHTML pour importer votre texte/code dans UIWebView (y compris le code CSS pour rendre l'arrière-plan transparent) puis vous pouvez utiliser javascript pour le rendre non sélectionnable mais encore défilable). –

45

J'ai trouvé que l'appel

[textView setUserInteractionEnabled:NO]; 

fonctionne très bien.

+26

Cela désactivera également la fonction de défilement sur UITextView –

+10

Et désactiver la possibilité de cliquer sur les liens – barfoon

+2

J'utilise le uitextview comme sous-vue dans une uitableviewcell personnalisée. Cela fonctionne comme un rêve –

7

UITextView « s selectable propriété:

Cette propriété contrôle la capacité de l'utilisateur de sélectionner le contenu et interagir avec les URL et les pièces jointes de texte. La valeur par défaut est YES.

1

Pour ce faire, la première sous-classe le UITextView

et dans la mise en œuvre procédez comme suit

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event 
{ 
    self.selectable = NO; 
} 

- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event 
{ 
     self.selectable = YES; 
} 

cela fonctionne bien,

Questions connexes