【问题标题】:Can'T click textView when delegate is set设置委托时无法单击 textView
【发布时间】:2025-12-22 11:20:15
【问题描述】:

我有一个应用程序,其中有 2 个视图相互叠加,在重叠视图上,有一个 UITextView 和一个 UIButton。
当我单击按钮时,TextView 应该变小
(从CGRectMake(0, 50, self.view.frame.bounds.size.width, 100)

CGRectMake(0, 50, self.view.frame.bounds.size.width, 50))并且在第二次单击时它应该再次变大。
这是我如何管理它的代码:

-(IBAction)buttonTouched:(id)sender {
    if(counter == 1) {
    [self.textView removeFromSuperview];
    self.textView = nil;
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 50, self.view.frame.bounds.size.width, 50)];
    [self.overlayView addSubview:self.textView];
    counter = 2;
    } else {
        [self.textView removeFromSuperview];
        self.textView = nil;
        self.textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 50, self.view.frame.bounds.size.width, 100)];
        [self.overlayView addSubview:self.textView];
        counter = 1;
    }
}

我的问题是,当我这样做时,如果不设置委托,我将无法像 textViewDidBeginEditing:(UITextView *)textView 那样处理 UITextView 的委托方法。但是,当我在重新创建 TextView 后将委托设置为 self.textView.delegate = self 时,单击它时没有任何反应。没有键盘出现,也没有调用事件。 有什么建议吗?

【问题讨论】:

  • 您可以分享任何图片以便我们将问题可视化吗?
  • 关于这些观点还有很多,我只是总结了我的问题

标签: ios objective-c cocoa-touch uitextview


【解决方案1】:

尝试alloc你的textView在ViewDidLoad

self.textView = [[UITextView alloc]init];

and on the button click use

[self.textView setFrame:CGRectMake(0, 50, self.view.frame.bounds.size.width, 50)];

and 

[self.textView setFrame:CGRectMake(0, 50, self.view.frame.bounds.size.width, 100)];

【讨论】:

  • 查看 Akhilrajtr 的回答,非常相似,我发布了我得到的结果
【解决方案2】:
-(IBAction)buttonTouched:(id)sender {
    if(counter == 1) {
    [self.textView removeFromSuperview];
    self.textView = nil;
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 50, self.view.frame.bounds.size.width, 50)];
    [self.overlayView addSubview:self.textView];
    counter = 2;
    } else {
        [self.textView removeFromSuperview];
        self.textView = nil;
        self.textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 50, self.view.frame.bounds.size.width, 100)];
        [self.overlayView addSubview:self.textView];
        counter = 1;
    }
}
  • 在上面的代码中,只将“self.view.bounds.size.width”改为“self.view.frame.bounds.size.width”
  • 在 .h 文件中分配委托“self.textView.delegate=self”之前 @interface ViewController : UIViewController

【讨论】:

  • overlayView 的背景色是什么?检查您的文本视图是否显示...
  • [UIColor clearColor]。它显示出来了,我看到了我为它设置的默认文本。
  • 是的,它在那里实现。
  • 这就是为什么 textview 不可触摸的原因,因为 googleadmob 默认视图位于您的 textview 前面,并且每次都会更新。
  • 我该如何解决这个问题?
【解决方案3】:

试试这个,

viewDidLoad 中初始化和addSubview self.textView 并设置self.textView.delegate = self;

-(IBAction)buttonTouched:(id)sender {
    if(counter == 1) {

    self.textView.frame = CGRectMake(0, 50, self.view.frame.bounds.size.width, 50);
    counter = 2;
    } else {

        self.textView.frame = CGRectMake(0, 50, self.view.frame.bounds.size.width, 100);
        counter = 1;
    }
    [self.overlayView bringSubviewToFront:self.textView];
}

只要把self.textView的框架改成buttonTouched:就行了

【讨论】:

  • 当我这样做时,textView 就像在我的故事板中一样显示(较小的尺寸,就像我用 CGRect 在另一个位置绘制的那样),我仍然无法点击它。
  • 你把IBOutlet连接到textview了吗?
  • textview 或overlayView 是否有其他视图?试试[self.view bringSubviewToFront:self.overlayView];
  • 我不知道。有什么方法可以检查吗?我实现了 Google Admob(在 overlayView 上),它之前搞砸了一些事情,但我没有创建另一个视图