Jak zamknąć klawiaturę dla UITextView za pomocą klawisza return?
W bibliotece IB, wprowadzenie mówi nam, że po naciśnięciu klawisza return, klawiatura UITextView
zniknie. Ale w rzeczywistości Klucz return może działać tylko jako '\n'.
Mogę dodać przycisk i użyć [txtView resignFirstResponder]
, aby ukryć klawiaturę.
Ale czy jest sposób na dodanie akcji dla klawisza return w klawiaturze, żebym nie musiał dodawać UIButton
?
30 answers
UITextView
nie posiada żadnych metod, które zostaną wywołane, gdy użytkownik naciśnie klawisz return. Jeśli chcesz, aby użytkownik mógł dodać tylko jeden wiersz tekstu, użyj UITextField
. Naciśnięcie klawisza return i ukrycie klawiatury UITextView
nie postępuje zgodnie z wytycznymi interfejsu.
Nawet wtedy, jeśli chcesz to zrobić, zaimplementuj metodę textView:shouldChangeTextInRange:replacementText:
z UITextViewDelegate
i sprawdź, czy tekst zastępczy to \n
, ukryj klawiaturę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 06:15:10
Pomyślałem, że zamiast tego wrzucę fragment tutaj:
Upewnij się, że zadeklarowałeś wsparcie dla UITextViewDelegate
Protokołu.
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
Swift 4.0 update:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
return false
}
return true
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 15:43:02
Wiem, że już na to odpowiedziałam, ale nie lubię używać znaków literalnych dla nowej linii, więc oto, co zrobiłem.
- (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
return YES;
}
[txtView resignFirstResponder];
return NO;
}
Swift 4.0 update:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
return true
}
txtView.resignFirstResponder()
return false
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-20 04:47:54
Wiem, że wiele razy na to odpowiadano, ale oto moje dwa grosze na ten temat.
Znalazłem odpowiedzi samvermette i ribeto naprawdę przydatne, a także komentarz maxpower w odpowiedzi ribeto {5]}. Ale jest problem z tymi podejściami. Problem, który matt wspomina w odpowiedzi samvermette i polega na tym, że jeśli użytkownik chce wkleić coś z przerwaniem linii w środku, klawiatura ukryje bez wklejania czegokolwiek.
Więc moje podejście jest mieszanką trzech wyżej wymienionych rozwiązań i tylko sprawdzanie, czy wprowadzony ciąg jest nową linią, gdy długość łańcucha wynosi 1, więc upewniamy się, że użytkownik pisze zamiast wklejać.
Oto co zrobiłem:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
if ([text length] == 1 && resultRange.location != NSNotFound) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26
Bardziej eleganckim sposobem jest odrzucenie klawiatury, gdy użytkownik dotknie gdzieś poza ramką klawiatury.
Najpierw ustaw widok ViewController na klasę "UIControl" w Inspektorze tożsamości w Uibuilderze. Control-przeciągnij widok do pliku nagłówkowego Viewcontrollera i połącz go jako akcję ze zdarzeniem Touch Up Inside, na przykład:
ViewController.h
-(IBAction)dismissKeyboardOnTap:(id)sender;
W głównym pliku ViewController, ViewController.m:
-(IBAction)dismissKeyboardOnTap:(id)sender
{
[[self view] endEditing:YES];
}
Możesz wymagać podwójne dotknięcie lub długie dotknięcie przy użyciu podobnych technik. Może być konieczne ustawienie ViewController jako UITextViewDelegate i podłączenie TextView do ViewController. Ta metoda działa zarówno dla UITextView jak i UITextField.
Źródło: Big Nerd RanchEDIT: chciałbym również dodać, że jeśli używasz UIScrollView, powyższa technika może nie działać tak łatwo przez konstruktora interfejsu. W takim przypadku możesz użyć UIGestureRecognizer i wywołać [[self view] endEditing: YES] method within it instead. Przykładem może być:
-(void)ViewDidLoad{
....
UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(tap:)];
[self.view addGestureRecognizer: tapRec];
....
}
-(void)tap:(UITapGestureRecognizer *)tapRec{
[[self view] endEditing: YES];
}
Gdy użytkownik dotknie poza klawiaturą i nie dotknie przestrzeni wejściowej, klawiatura zostanie odrzucona.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-24 21:24:01
Dodaj tę metodę do kontrolera widoku.
Swift :
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
return false
}
return true
}
Ta metoda może być również pomocna dla Ciebie:
/**
Dismiss keyboard when tapped outside the keyboard or textView
:param: touches the touches
:param: event the related event
*/
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
if let touch = touches.anyObject() as? UITouch {
if touch.phase == UITouchPhase.Began {
textField?.resignFirstResponder()
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 07:43:46
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if([text isEqualToString:@"\n"])
[textView resignFirstResponder];
return YES;
}
yourtextView.delegate=self;
Dodaj również UITextViewDelegate
Nie zapomnij potwierdzić protokołu
Jeśli nie dodałeś if([text isEqualToString:@"\n"])
nie możesz edytować
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 00:55:49
Istnieje inne rozwiązanie podczas korzystania z uitextview, Możesz dodać pasek narzędzi jako InputAccessoryView w "textViewShouldBeginEditing", a z tego paska narzędziowego przycisku Gotowe możesz zamknąć klawiaturę, kod do tego jest następujący:
In viewDidLoad
toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; //toolbar is uitoolbar object
toolBar.barStyle = UIBarStyleBlackOpaque;
UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnClickedDone:)];
[toolBar setItems:[NSArray arrayWithObject:btnDone]];
W metodzie textviewdelegate
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
[textView setInputAccessoryView:toolBar];
return YES;
}
W akcji przycisku Done, który znajduje się w pasku narzędzi jest następujący:
-(IBAction)btnClickedDone:(id)sender
{
[self.view endEditing:YES];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 08:14:15
Znalazłem odpowiedź josebama jako najbardziej kompletną i czystą odpowiedź dostępną w tym wątku.
Poniżej znajduje się składnia Swift 3:
func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
if text.characters.count == 1 && resultRange != nil {
textView.resignFirstResponder()
// Do any additional stuff here
return false
}
return true
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 10:43:10
Podobnie jak matt komentuje samvermette, nie podoba mi się też pomysł wykrywania "\n". Klucz "return" znajduje się w UITextView z jakiegoś powodu, czyli oczywiście przejść do następnej linii.
Moim zdaniem najlepszym rozwiązaniem jest naśladowanie aplikacji iPhone message - czyli dodanie paska narzędzi (i przycisku) na klawiaturze.
Otrzymałem kod z następującego wpisu na blogu:
Http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/
Kroki:
- Dodaj pasek narzędzi do swojego Plik XIB-Ustaw wysokość na 460
- Dodaj element przycisku paska narzędzi (jeśli nie został dodany). Jeśli chcesz wyrównać go do prawej, Dodaj element przycisku elastycznego paska do XIB i przesuń element przycisku paska narzędzi
- Utwórz akcję, która połączy twój element przycisku z resignFirstResponder w następujący sposób:
- (IBAction)hideKeyboard:(id)sender {
[yourUITextView resignFirstResponder];
}
-wtedy:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
CGRect frame = self.keyboardToolbar.frame;
frame.origin.y = self.view.frame.size.height - 260.0;
self.keyboardToolbar.frame = frame;
[UIView commitAnimations];
}
- (void)keyboardWillHide:(NSNotification *)notification {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
CGRect frame = self.keyboardToolbar.frame;
frame.origin.y = self.view.frame.size.height;
self.keyboardToolbar.frame = frame;
[UIView commitAnimations];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-21 00:21:25
Po prostu rozwiązałem ten problem w inny sposób.
- Utwórz przycisk, który będzie umieszczony w tle
- z Inspektora atrybutów Zmień typ przycisku na niestandardowy, a przycisk będzie przezroczysty.
- rozwiń przycisk, aby pokryć cały widok i upewnij się, że Przycisk znajduje się za wszystkimi innymi obiektami. Łatwo to zrobić, przeciągając przycisk na górę widoku listy w widoku
-
Sterowanie przeciągnij przycisk do pliku
viewController.h
i utwórz akcja (wysłane Zdarzenie: Touch Up Inside) jak:(IBAction)ExitKeyboard:(id)sender;
-
W
ViewController.m
powinno wyglądać tak:(IBAction)ExitKeyboard:(id)sender { [self.view endEditing:TRUE]; }
- Uruchom aplikację, a po kliknięciu z dala od widoku tekstowego klawiatura znika
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-27 10:26:51
Dodaj obserwatora w viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];
A następnie użyj selektora, aby sprawdzić "\N "
-(void) textViewKeyPressed: (NSNotification*) notification {
if ([[[notification object] text] hasSuffix:@"\n"])
{
[[notification object] resignFirstResponder];
}
}
Używa "\n " i nie sprawdza konkretnie klucza zwrotnego, ale myślę, że jest to OK.
UPDATE
Zobacz odpowiedź ribto poniżej, która używa [NSCharacterSet newlineCharacterSet]
zamiast \n
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 18:37:57
Używanie kontrolera Nawigacyjnego do obsługi paska do zwalniania klawiatury:
W .plik h:
UIBarButtonItem* dismissKeyboardButton;
W .plik m:
- (void)viewDidLoad {
dismissKeyboardButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard)];
}
-(void)textViewDidBeginEditing:(UITextView *)textView {
self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}
-(void)textFieldDidBeginEditing:(UITextField *)textField {
self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}
-(void)dismissKeyboard {
[self.textField resignFirstResponder];
[self.textView resignFirstResponder];
//or replace this with your regular right button
self.navigationItem.rightBarButtonItem = nil;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 00:53:13
Spróbuj tego:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
if ([text isEqualToString:@"\n"]) {
[self.view endEditing:YES];
}
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 09:37:45
/ / możesz tego użyć ...
Krok 1. Pierwszym krokiem jest upewnienie się, że deklarujesz wsparcie dla protokołu UITextViewDelegate
. Odbywa się to w pliku nagłówkowym, jako przykład tutaj jest nagłówek o nazwie
EditorController.h:
@interface EditorController : UIViewController {
UITextView *messageTextView;
}
@property (nonatomic, retain) UITextView *messageTextView;
@end
Krok 2. Następnie musisz zarejestrować kontroler jako delegata UITextView. Kontynuując z powyższego przykładu, oto jak zainicjalizowałem UITextView
z {[5] } jako delegata ...
- (id) init {
if (self = [super init]) {
// define the area and location for the UITextView
CGRect tfFrame = CGRectMake(10, 10, 300, 100);
messageTextView = [[UITextView alloc] initWithFrame:tfFrame];
// make sure that it is editable
messageTextView.editable = YES;
// add the controller as the delegate
messageTextView.delegate = self;
}
Krok 3. A teraz ostatni kawałek puzzle ma podjąć działania w odpowiedzi na wiadomość shouldCahngeTextInRange
w następujący sposób:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text
{
// Any new character added is passed in as the "text" parameter
if ([text isEqualToString:@"\n"]) {
// Be sure to test for equality using the "isEqualToString" message
[textView resignFirstResponder];
// Return FALSE so that the final '\n' character doesn't get added
return FALSE;
}
// For any other character return TRUE so that the text gets added to the view
return TRUE;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-19 12:18:27
Swift
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
}
return true
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-22 23:55:24
Kod Swift
Zaimplementuj UITextViewDelegate w swojej klasie / widoku w następujący sposób:
class MyClass: UITextViewDelegate { ...
Ustaw delegata textView na self
myTextView.delegate = self
A następnie wdrożyć następujące:
func textViewDidChange(_ textView: UITextView) {
if textView.text.characters.count >= 1 {
if let lastChar = textView.text.characters.last {
if(lastChar == "\n"){
textView.text = textView.text.substring(to: textView.text.index(before: textView.text.endIndex))
textView.resignFirstResponder()
}
}
}
}
Edytuj Zaktualizowałem Kod, ponieważ nigdy nie jest dobrym pomysłem, aby zmienić wejście użytkownika w polu tekstowym do obejścia i nie Resetowanie stanu po zakończeniu kodu hack.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 13:05:59
Możesz także ukryć klawiaturę po dotknięciu ekranu widoku:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
[txtDetail resignFirstResponder];
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-24 10:45:04
Szybka Odpowiedź:
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
view.addGestureRecognizer(tapGestureReconizer)
}
func tap(sender: UITapGestureRecognizer) {
view.endEditing(true)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 02:26:08
Użyłem tego kodu, aby zmienić respondera.
- (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"\n"]) {
//[textView resignFirstResponder];
//return YES;
NSInteger nextTag = textView.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [self.view viewWithTag:nextTag];
if (nextResponder) {
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
} else {
// Not found, so remove keyboard.
[textView resignFirstResponder];
}
return NO;
return NO;
}
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 11:23:32
Ok. Każdy dał odpowiedzi sztuczkami, ale myślę, że właściwym sposobem na osiągnięcie tego jest
Podłączenie następującej akcji do zdarzenia " Did End On Exit" W Interface Builder
.
(kliknij prawym przyciskiem myszy TextField
i przeciągnij cntrl z " skończyło się na wyjściu " do następującej metody.
-(IBAction)hideTheKeyboard:(id)sender
{
[self.view endEditing:TRUE];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 10:23:16
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (range.length==0) {
if ([text isEqualToString:@"\n"]) {
[txtView resignFirstResponder];
if(textView.returnKeyType== UIReturnKeyGo){
[self PreviewLatter];
return NO;
}
return NO;
}
} return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 06:37:38
+ (void)addDoneButtonToControl:(id)txtFieldOrTextView
{
if([txtFieldOrTextView isKindOfClass:[UITextField class]])
{
txtFieldOrTextView = (UITextField *)txtFieldOrTextView;
}
else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
{
txtFieldOrTextView = (UITextView *)txtFieldOrTextView;
}
UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,
0,
[Global returnDeviceWidth],
50)];
numberToolbar.barStyle = UIBarStyleDefault;
UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_return"]
style:UIBarButtonItemStyleBordered
target:txtFieldOrTextView
action:@selector(resignFirstResponder)];
numberToolbar.items = [NSArray arrayWithObjects:btnDone,nil];
[numberToolbar sizeToFit];
if([txtFieldOrTextView isKindOfClass:[UITextField class]])
{
((UITextField *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
}
else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
{
((UITextView *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 08:01:46
Pytanie, Jak to zrobić z klawiszem return, ale myślę, że może to pomóc komuś z zamiarem, aby klawiatura zniknęła podczas korzystania z UITextView:
@IBOutlet weak var textView: UITextView!
private func addToolBarForTextView() {
let textViewToolbar: UIToolbar = UIToolbar()
textViewToolbar = UIBarStyle.Default
textViewToolbar = [
UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.cancelInput)),
UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.doneInput))
]
textViewToolbar()
self.textView.inputAccessoryView = textViewToolbar //do it for every relevant textView if there are more than one
}
func doneInput() {
self.textView.resignFirstResponder()
}
func cancelInput() {
self.textView.text = ""
self.textView.resignFirstResponder()
}
Wywołanie addToolBarForTextView () w viewDidLoad lub innej metodzie cyklu życia.
Wydaje się, że było to dla mnie idealne rozwiązanie. Zdrówko, zdrówko]}Murat
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-16 11:04:37
-(BOOL)textFieldShouldReturn:(UITextField *)textField; // called from textfield (keyboard)
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; // good tester function - thanks
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-30 13:36:25
Wiem, że to nie jest dokładna odpowiedź na to pytanie, ale znalazłem ten wątek po polowaniu na internet w poszukiwaniu odpowiedzi. Zakładam, że inni podzielają to uczucie.
To jest moja wariancja UITapGestureRecognizer, który uważam za niezawodny i łatwy w użyciu-wystarczy ustawić delegata TextView do kontrolera ViewController.
Zamiast ViewDidLoad dodaję UITapGestureRecognizer, gdy TextView stanie się aktywny do edycji:
-(void)textViewDidBeginEditing:(UITextView *)textView{
_tapRec = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
[self.view addGestureRecognizer: _tapRec];
NSLog(@"TextView Did begin");
}
Gdy dotknę poza TextView, widok kończy tryb edycji i uitapgesturerecognizer usuwa się, więc mogę kontynuować interakcję z innymi kontrolkami w widoku.
-(void)tap:(UITapGestureRecognizer *)tapRec{
[[self view] endEditing: YES];
[self.view removeGestureRecognizer:tapRec];
NSLog(@"Tap recognized, tapRec getting removed");
}
Mam nadzieję, że to pomoże. Wydaje się to tak oczywiste, ale nigdy nie widziałem takiego rozwiązania nigdzie w sieci - czy robię coś nie tak?Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-13 21:12:27
Nie zapomnij ustawić delegata dla textView - w przeciwnym razie resignfirstresponder nie będzie działać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 06:53:07
Spróbuj tego .
NSInteger lengthOfText = [[textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 09:51:55
Dla Xcode 6.4., Swift 1.2 :
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
{
super.touchesBegan(touches, withEvent: event)
if let touch = touches.first as? UITouch
{
self.meaningTextview.resignFirstResponder()
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 09:12:13
Mój hack do tego:
1-Utwórz przycisk pokrywający cały widok; 2-Wyślij go do tła widoku, 3-zmień jego typ Z "Round Rect" na "Custom" w Inspektorze atrybutów, 4-Utwórz akcję 5-wdrożenie metody działania:
- (IBAction)bgTouched:(id)sender
{
//to dismiss keyboard on bg btn pressed
[_userInput resignFirstResponder];
}
Gdzie _userInput to twoje pole tekstowe
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-21 11:55:42