【问题标题】:Insert date/time in UITextView when user hits return当用户点击返回时在 UITextView 中插入日期/时间
【发布时间】:2011-03-30 01:43:54
【问题描述】:

每当用户点击返回键或开始在 Xcode 中的 UITextView 上输入时,我都会尝试插入当前日期/时间,但不太确定从哪里开始。

我知道此方法适用于单击 TextView 但似乎不起作用:

- (void)textViewDidBeginEditing:(UITextView *)textView {
    self.txtDetail.text = [self.txtDetail.text stringByAppendingString:@"Hello!"];
}

谢谢

更新:

DetailViewController.h 
@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate> { 
    UITextView *txtDetail;
 } 
@property (nonatomic, retain) IBOutlet UITextView *txtDetail;

 - (void)textViewDidBeginEditing:(UITextView *)textView;

DetailViewController.m 
@synthesize txtDetail;

 - (void)textViewDidBeginEditing:(UITextView *)textView { 
    NSLog(@"Hello");
    self.txtDetail.text = [self.txtDetail.text stringByAppendingString:@"Hello!"];
}

更新02:

我已将此添加到我的 .m 文件中:

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

    BOOL shouldChangeText = YES;  

    if ([text isEqualToString:@"\n"]) {  
        // Find the next entry field  

        txtDetail.text = [txtDetail.text stringByAppendingString:@"\nhey\n"];       }  
        textView.editable = YES;

        shouldChangeText = NO; 
    [textView becomeFirstResponder];

    return shouldChangeText;  
}

我得到了想要的效果(嘿,每当我在键盘上按回车键时都会添加)但我现在不能输入任何东西......有什么想法吗?

【问题讨论】:

  • 你有没有设置任何类作为 UITextView 的代理?你确定它实现了 UITextViewDelegate 协议吗?
  • 可能不会生病将我的代码贴在下面...
  • DetailViewController.h @interface DetailViewController : UIViewController { UITextView *txtDetail; @property (nonatomic, 保留) IBOutlet UITextView *txtDetail; - (void)textViewDidBeginEditing:(UITextView *)textView; DetailViewController.m @synthesize txtDetail; - (void)textViewDidBeginEditing:(UITextView *)textView { NSLog(@"Hello"); self.txtDetail.text = [self.txtDetail.text stringByAppendingString:@"Hello!"]; }

标签: iphone xcode uitextview ipad uitextviewdelegate


【解决方案1】:

您必须将控制器声明为实现 UITextViewDelegate 协议,然后将其连接为文本视图的委托。否则它根本不会收到委托消息。

那么你必须实现:

– textView:shouldChangeTextInRange:replacementText:

... 返回 YES/TRUE 否则不会添加任何文本。

更新02:

您需要实现所有有返回的 UITextViewDelegate 协议方法。如果您不这样做,则文本视图默认假定为“否”。

见:Text and Web Programming Guide: Managing TextFields and TextViews

你还需要了解Delegate Pattern

【讨论】:

  • 谢谢,不太清楚如何实现它......我假设我有 UIPopoverControllerDelegate、UISplitViewControllerDelegate 我添加了 UITextViewDelegate 但是我如何将它连接到该方法。感谢帮助:)
  • 如果您使用 nib,则在文本视图的委托属性和将成为 nib 文件所有者的控制器之间建立连接。您必须声明 UITextViewDelegate 并保存标题,然后它才会显示在 Interface Builder 中。如果您以编程方式设置视图,则只需使用 self.textView.delegate=self;
  • 这很混乱!我在xib上设置了一个代表链接它。但我真的不明白我现在应该做什么......该方法似乎仍然没有链接到任何东西,在某个地方是否有这个功能的一个非常基本的例子?
  • 这些方法没有链接到任何东西。相反,您将 textView 的委托出口链接到实现委托协议的对象。在这种情况下,它是您的控制器。您必须在委托对象中实现协议的方法。然后当 textView 需要查询它的委托时,它会发送适当的消息,即方法的选择器,然后调用该方法的控制器。
  • 害怕,不要明白,有什么例子吗?似乎找不到任何此类操作的示例代码,这很奇怪,因为它应该是一段简单的常见代码。
【解决方案2】:

用下面的方法替换你的方法

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

   BOOL shouldChangeText = YES;   

   if ([text isEqualToString:@"\n"] && textView == detailText) 
   {   
     // Find the next entry field   

       txtDetail.text = [txtDetail.text stringByAppendingString:@"\nhey\n"];          
       textView.editable = YES; 

       shouldChangeText = NO;  
       [textView becomeFirstResponder]; 
   } 
   return shouldChangeText;   
} 

【讨论】:

    【解决方案3】:

    委托调用机制是 iOS 编程中非常重要的一部分。 Apple 图书馆中有一个关于它的文档,并且在许多好书中也有讨论。 Apress 的《Beginning iPhone Programming》一书非常好,涵盖了委托方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      相关资源
      最近更新 更多