resignFirstResponder UITextView

Posted

技术标签:

【中文标题】resignFirstResponder UITextView【英文标题】: 【发布时间】:2011-07-19 21:03:57 【问题描述】:

我正在使用 UITEXTVIEW。当按下完成按钮时,我试图发送一个 resignFirstResponder 。我不确定如何触发包含 resignFirstResponder 行的方法。

我已将 UITextView 的委托设置为 Interface Builder 中的文件所有者。这是我的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];

【问题讨论】:

***.com/questions/703754/… 【参考方案1】:

你可以试试这个:

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

当然,如果您这样做,您将无法输入实际的回车。

【讨论】:

或查看 Espresso 发布的链接,它说的是同样的事情 ;) 返回一个 void 函数?【参考方案2】:

查看您的源代码后,我发布的链接毫无意义。我以为你在谈论键盘上的完成键。但是现在我看到你在说导航栏上的一个实例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];

这几乎是一样的,除了这个创建了一个具有适当样式的按钮。

无论如何,我看不到按钮是如何添加的,因为viewDidLoad: 中没有调用addButton:isLast:。在您的viewDidLoad: 中添加以下行。

[self addButton:self isLast:NO];

last 在您的 addButton:isLast: 中是多余的,因为它甚至没有被使用,所以我只是传递任何东西 (NO)。

您几乎完成了,但是如果您按下该按钮,您的应用程序将崩溃,因为finishQuestionnaire: 未在self (CommentQuestionViewController) 上实现。而且由于您想在用户按下完成按钮时关闭键盘,因此我们还将在此处将您的文本视图作为第一响应者。只需添加以下方法:

- (void)finishQuestionnaire:(id)sender

    [inputAnswer resignFirstResponder];

【讨论】:

【参考方案3】:

是 BOOL 就是这样..

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

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

    return YES;

如果这不起作用,请检查以下事项..

    你的 textView 是否连接到你的类中定义的 textView 属性。(你可以在你的 xib 中看到这个,带有箭头图标)。

2.检查textView委托是否写在你的.h文件中。

@interface YourViewController : UIViewController <UITextViewDelegate>

3.检查textView的delegate是否被分配。

//set this in the viewDidLoad method
self.textView.delegate = self;

【讨论】:

如果不起作用,请检查以下事项。【参考方案4】:

通过此方法检查换行符。

-(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;
    

【讨论】:

以上是关于resignFirstResponder UITextView的主要内容,如果未能解决你的问题,请参考以下文章

resignFirstResponder 没有在 iPad 中隐藏 UIkeyboard

MonoTouch:ResignFirstResponder() 问题

点击UITableView时resignFirstResponder?

直接调用 UIResponder.resignFirstResponder 可以吗?

UITextField becomeFirstResponder 触发_resignFirstResponder

键盘解雇的 resignFirstResponder 与 endEditing