resignFirstResponder UITextView - PullRequest
       19

resignFirstResponder UITextView

2 голосов
/ 20 июля 2011

Я использую UITEXTVIEW . Я пытаюсь отправить resignFirstResponder при нажатии кнопки Готово. Я не уверен, как вызвать метод, содержащий строку resignFirstResponder.

Я установил делегата UITextView для владельца файла в Интерфейсном Разработчике. Это заголовок и файл реализации моего viewcontroller:

#import <Foundation/Foundation.h>
#import "Question.h"

@interface CommentQuestionViewController : UIViewController {
    Question *question;
    IBOutlet UILabel *questionTitle;
    IBOutlet UITextView *inputAnswer; //this is the textview
}

@property (nonatomic, retain) UILabel *questionTitle;
@property (nonatomic, retain) Question *question;
@property (nonatomic, retain) UITextView *inputAnswer;

- (void) addButton:(id)sender isLast:(BOOL)last;
- (void) setQuestionId:(NSString*)quId withTitle:(NSString*)quTitle number:(NSString*)quNum section:(NSString*)sId questionType:(NSString*)qt;

@end


#import "CommentQuestionViewController.h"


@implementation CommentQuestionViewController

@synthesize questionTitle, question, inputAnswer;

- (void) addButton:(id)delegate isLast:(BOOL)last{
    UIBarButtonItem *anotherButton;
    anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:delegate action:@selector(finishQuestionnaire:)];     
    self.navigationItem.rightBarButtonItem = anotherButton;
    [anotherButton release];
}

-(void)viewDidLoad{  
    //self.questionTitle.text = question.qTitle;
    [[self questionTitle] setText:[question qTitle]];
    [super viewDidLoad];
    NSString *str = [NSString stringWithFormat:@"Question %@", [question qNumber]];
    //self.title = str;
    [self setTitle:str];
    [str release];
}

-(void) setQuestionId:(NSString*)quId withTitle:(NSString*)quTitle number:(NSString*)quNum section:(NSString*)sId questionType:(NSString*)qt{   
    question = [[Question alloc]init];
    [question setQId:quId];
    [question setQTitle:quTitle];
    [question setQNumber:quNum];
    [question setSectionId:sId];
    [question setQType:qt];
}

- (void) viewWillAppear:(BOOL)animated{
    self.navigationItem.hidesBackButton = YES;
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void) textViewDidEndEditing:(UITextView*)textView{
    [textView resignFirstResponder];
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [inputAnswer release];
    [questionTitle release];
    [question release];
    [super dealloc];
}

Ответы [ 4 ]

2 голосов
/ 20 июля 2011

Вы можете попробовать это:

–(BOOL)textView:(UITextView*)textView shouldChangeCharactersInRange:(NSRange)range replacementText:(NSString*)text {
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    else
        return YES;
}

Конечно, вы не сможете набрать фактический возврат каретки, если вы сделаете это.

1 голос
/ 30 июня 2014

Это БУЛ, вот и все ..

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

Если это не сработает, пожалуйста, проверьте следующее:

  1. Подключен ли ваш textView к свойству textView, определенному в вашем классе .. (Вы можете увидеть это в xib со значком стрелки).

2. Проверьте, записан ли делегат textView в ваш файл .h.

@interface YourViewController : UIViewController <UITextViewDelegate>

3. Проверьте, назначен ли делегат textView.

//set this in the viewDidLoad method
self.textView.delegate = self;
1 голос
/ 20 июля 2011

После просмотра вашего исходного кода ссылка, которую я разместил, не имеет смысла.Я думал, что вы говорите о готовой клавише на клавиатуре.Но теперь я вижу, что вы говорили об экземпляре UIButton на панели навигации, верно?

Ваш addButton:isLast: метод выглядит великолепно, но я бы немного его изменил, чтобы он придерживался Apple HIG :

- (void)addButton:(id)delegate isLast:(BOOL)last
{
    UIBarButtonItem *anotherButton;
    anotherButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                    target:delegate
                                                    action:@selector(finishQuestionnaire:)]; 
    self.navigationItem.rightBarButtonItem = anotherButton;
    [anotherButton release];
}

Это почти то же самое, за исключением того, что этот создает кнопку с соответствующим стилем.

Во всяком случае, я не вижу, каккнопка добавляется, поскольку addButton:isLast: не вызывается в viewDidLoad:.Добавьте следующую строку в ваш viewDidLoad:.

[self addButton:self isLast:NO];

last избыточен в вашем addButton:isLast:, так как он даже не используется, поэтому я просто передаю (NO).

Вы почти закончили, но если вы нажмете эту кнопку, ваше приложение зависнет, поскольку finishQuestionnaire: не реализовано в self (CommentQuestionViewController).А поскольку вы хотите отменить клавиатуру, когда пользователь нажимает кнопку «Готово», именно здесь мы также оставляем текстовое представление в качестве первого респондента.Просто добавьте следующий метод:

- (void)finishQuestionnaire:(id)sender
{
    [inputAnswer resignFirstResponder];
}
0 голосов
/ 03 июня 2015

Проверьте наличие символа новой строки этим методом.

- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet *) aSet

Затем проверьте длину текста, еслиэто одна длина символа, затем вводится символ новой строки, а не вставляется.

   - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
     BOOL hasNewLineCharacterTyped = (text.length == 1) && [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location != NSNotFound;
     if (hasNewLineCharacterTyped) {
         [textView resignFirstResponder];
         return NO;
     }
      return YES;
    }
...