【问题标题】:How do i disable the editing of a UITextView based on a UISwitch?如何禁用基于 UISwitch 的 UITextView 的编辑?
【发布时间】:2016-04-27 15:21:09
【问题描述】:

我有一个 UITextView,如果 UISwitch 的状态设置为 ON,我想禁用它的“可编辑”属性。

myTextView = [[UITextView alloc]initWithFrame:CGRectMake(20, 180, 200, 30)];
myTextView.backgroundColor = [UIColor whiteColor];
myTextView.text = @"This is a textView";
[self.view addSubview:myTextView];
mySwitch = [[UISwitch alloc]initWithFrame:CGRectMake(230, 125, 200, 30)];
[self.view addSubview:mySwitch];

我知道我可以使用以下方法检查开关的状态:

if ([mySwitch isOn]) {
    myTextView.editable = NO;
} else {
    myTextView.editable = YES;
}

问题是当我运行我的项目时,文本不可编辑,但是当我滑动开关时,文本无法编辑(这在上面的代码中很明显)。如果我切换开关,我想知道如何更改 UITextView 的可编辑属性。

【问题讨论】:

    标签: ios objective-c iphone uitextview uiswitch


    【解决方案1】:

    您需要添加一个 IBAction 并将其连接到 switch 方法Value Changed

    -(IBAction)toggleSwitch:(UISwitch*)sw {
        myTextView.editable = sw.on;
        NSLog(@"Value Changed");
    }
    

    编辑:以编程方式而不是通过 Interface Builder 执行此操作的代码

    myTextView = [[UITextView alloc]initWithFrame:CGRectMake(20, 180, 200, 30)];
    myTextView.backgroundColor = [UIColor whiteColor];
    myTextView.editable = NO;
    myTextView.text = @"This is a textView";
    [self.view addSubview:myTextView];
    
    
    mySwitch = [[UISwitch alloc]initWithFrame:CGRectMake(230, 125, 200, 30)];
    mySwitch.on = NO;
    [mySwitch addTarget:self action:@selector(toggleSwitch:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:mySwitch];
    
    -(void)toggleSwitch:(UISwitch*)sw {
        myTextView.editable = sw.on;
    }
    

    【讨论】:

    • @Tejas K 故事板中的所有内容都正确连接了吗?
    • 是的,我检查了一切,看起来很好。
    • 我已经测试了上面的代码并且它可以工作,在函数中添加一个日志以确保它被触发。
    【解决方案2】:

    UISwitchUIControl 类的子类,除其他外,它提供了一个基于目标操作的模型,用于接收有关控件状态的更新。

    这意味着您可以使用-[UIControl addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents] 方法在开关更改其布尔值时调用您的方法:

    [yourSwitch addTarget:self action:@selector(switchToggled:) forControlEvents:UIControlEventValueChanged]
    

    您也可以通过 Interface Builder 执行此操作,方法是右键单击您的 UISwitch 并将其 action 分配给适当的 IBAction 方法:

    - (IBAction) switchToggled:(UISwitch*)switchControl {
        yourTextView.editable = switchControl.on;
    }
    

    【讨论】:

      【解决方案3】:
      if ([mySwitch isOn]) {
          myTextView.editable = NO;
          [myTextView resignFirstResponder];
      } else {
          myTextView.editable = YES;
          [myTextView becomeFirstResponder];
      }
      

      【讨论】:

      • 检查您的代码并确保没有这样的代码:myTextView .userInteractionEnabled = NO;
      【解决方案4】:

      您必须为开关创建一个动作,当开关的状态发生变化时触发该动作。如果您正在使用情节提要,请从开关中右键拖动到代码(例如创建插座)并选择action。在该函数中,您检查您的开关现在是打开还是关闭,并根据它使您的 TextView 可编辑

      【讨论】:

      • 我按照您的建议做了,现在开关的初始状态为 ON,无法编辑文本,我将开关关闭,然后我可以编辑它,但是当我重新打开开关时,文本仍然是可编辑的。
      • - (IBAction)flipped:(id)sender { if ([mySwitch isOn]) { myTextView.editable = NO; } else { myTextView.editable = YES; } }
      • 上面的代码在.m文件中,很抱歉它的发布方式,我是新来的:)
      • @TejasK 放置 2 个断点,1 个位于 if 中,1 个位于 else 中,以检查是否至少可以正常工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多