2009-12-01 49 views
1

我正在开发一个需要多行文本字段(UITextView)捕获一些文本的iPhone应用程序。UITextView没有事件

当用户触摸textView内部时,它变成firstResponder并显示键盘。我真正需要做的是在用户完成时移除键盘。通常在文本字段中,返回/完成按钮按下将指示打字结束,我将使用委托来辞退第一响应者。但是,对于多行textview,我希望用户能够添加一个新行,这是不可能的。

我的下一个选择是退出第一个响应者,如果在文本视图之外有触摸。这里的问题是在UITextView上没有声明我可以在界面构建器中看到的事件。

如何在iPhone应用程序中创建多行文本字段,并在合理的时间释放第一响应者?

回答

3

您可以使用完成按钮导航栏上:

- (void)viewDidLoad { 
     [super viewDidLoad]; 
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)]; 
} 

驳回键盘,用类似处理该事件:

- (void) doneAction: (id) sender{ [textView resignFirstResponder]; } 

(记住.h文件声明)

3

我猜你正在感叹键盘上的“丢失”完成按钮,这是在多行UItextView上返回的,纠正我,如果我错了。

最明显的方法似乎有你的界面,辞职第一响应另一个按钮。

我不认为一些聪明的代码隐藏键盘在某些事件将是非常直观的使用。

Apple Notes应用程序使用其右上角完成按钮来辞退第一响应者,这种方法似乎是合理的。

0

如果你是完全在具有键盘上的“完成”键设置,我使用的方法是检查的最后一个字符中的UITextView时的内容变化。如果最后一个字符是新行,那么用户已经完成了按钮。我想第二个尼尔认为应该有另一个按钮,但有时客户得到了客户想要的。

很明显,你必须设置委托的UITextView的指向在该方法中居住类。 - (void)textViewDidChange:(UITextView *)inTextView方法是UITextViewDelegate协议的一部分。

- (void)textViewDidChange:(UITextView *)inTextView { 
NSString *text = inTextView.text; 

if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') { 
    message = [text substringToIndex:[text length] -1]; 
    [delegate messageEdited]; 
    [self removeFromSuperview]; 
} 

}

1
//If user touches outside of the keypad, then the keypad will go away 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *touch = [[event allTouches] anyObject]; 
     if (touch.tapCount >= 1) { 
      [ZLabel resignFirstResponder]; 

     } 
    } 
0
  • (BOOL)的TextView:(UITextView的*)的TextView shouldChangeTextInRange:(NSRange)范围replacementText:(的NSString *)文本{

    [txtView resignFirstResponder]; 
    

    返回YES; }

1

您可以创建一个不可见的按钮,它覆盖了所有屏幕,并向其添加方法。我认为这样会有效。

- (IBAction)backgroundClick:(id)sender{ 
    [textView resignFirstResponder]; 
}