xcode中的UITextView问题

Posted

技术标签:

【中文标题】xcode中的UITextView问题【英文标题】:UITextView trouble in xcode 【发布时间】:2012-12-17 03:58:19 【问题描述】:

所以我正在阅读有关 UITextView 的描述,它说当您按下键盘上的“返回”按钮时它会自动隐藏键盘。但它不起作用,所以我尝试创建一个

- (IBAction)textViewReturn:(id)sender; 

   [myTextView resignFirstResponder];

那也没用,所以我也尝试过:

- (BOOL)textViewShouldReturn:(UITextView *)textView

  [myTextView resignFirstResponder];
  return NO;
 

不知道为什么整个交易一开始就不起作用。想知道是否有人可以提供帮助?

【问题讨论】:

请记住,textView 的通常 是用于允许用户输入多行文本,在这种情况下,您需要 Return 按钮不退出键盘,而是插入换行符。如果您只想要一行文本,那么 textField 可能是更好的选择。 是的,那么您建议在这种情况下如何找到隐藏键盘的方法? @lnafziger 【参考方案1】:

我在UITextView Class Reference 中没有看到任何说明当您按下 Return 时它会自动隐藏键盘的内容。

另外,UITextViewDelegate protocol 中没有 textViewShouldReturn: 消息。 UITextFieldDelegate protocol 中有 textFieldShouldReturn: 消息,但文本视图不是文本字段。

如果你想让它在用户按下 Return 时隐藏键盘,你需要做两件事。

首先,您需要将一些对象(通常是您的视图控制器)连接到文本视图的delegate 出口。您可以在您的 nib 中执行此操作,也可以在代码中执行此操作,也许在您的 viewDidLoad 方法中:

- (void)viewDidLoad 
    [super viewDidLoad];
    myTextView.delegate = self;

其次,你需要在你的委托对象中实现textView:shouldChangeTextInRange:replacementText:

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

请注意,如果用户粘贴包含换行符和其他字符的文本,则不会捕获换行符。它只会在用户点击 Return 键或粘贴仅包含换行符的文本时注意到。

您可以将委托的类声明为符合UITextViewDelegate 协议,在这种情况下,Xcode 将有助于自动完成方法名称。但即使类不符合协议,它也可以工作。

【讨论】:

我在这两段代码中都输入了.. 没有改变任何东西.. 我还能如何将一些对象连接到文本视图的代理出口? @robmayoff 在您的 nib 中,您可以控制并从 File's Owner 拖动到文本视图并选择 delegate 插座。您还需要确保 myTextView 确实连接到您的文本视图。 我的笔尖是故事板吗? @robmayoff 在情节提要中,您需要从视图控制器占位符(在视图下方的栏中)控制并拖动到文本视图。 我已经将storyboard中的textView连接到了属性(弱,非原子)IBOutlet UITextView *myTextView;线..是你的意思吗? @robmayoff【参考方案2】:

UITextView 的返回按钮用于将光标移动到新行。但是,如果您想在返回按钮上移除键盘,请尝试以下代码。当用户按下返回按钮时,它会退出键盘。因此,请尝试以下绝对解决您问题的代码。

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

【讨论】:

在这部分代码中......因为我将我的文本视图命名为 myTextView。每次放置 textView 时我都用 myTextView 替换吗? @Girish 不需要。该方法有一个 textView 参数,即当前的 textView。只需要将委托设置为 xib 中的每个 texview。 我现在很困惑。我已经写出了整个部分......没有任何改变......@Girish 在textview的delegate方法上设置debugger,如果delegates设置错了debugger来了。【参考方案3】:

根据您的评论,如果您想使用UITextField 而不是UITextView,那么事情保持不变,只是为了在您按下回车时隐藏键盘,您需要在文本字段的委托(确保您已经设置了这个):

- (BOOL)textFieldShouldReturn:(UITextField *)textField

    [textField resignFirstResponder];
    return YES;

【讨论】:

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

在多个 UITextView 中显示长文本

根据内容大小属性设置 UIText 视图的宽度

xcode中的UITextView问题

Xcode:在 UITextView 内定位图像

UIPopOver、UITextView 和自动调整大小

如何在 UITextView 中实现滚动功能?