搜尋

首頁  >  問答  >  主體

ios - 如何实现“文本框输入为空时,按钮禁用,文本框输入不空时,按钮可用”

我通过拖拽生成了一个文本框和一个按钮,我希望实现的功能是
“文本框输入为空时,按钮禁用,文本框输入不空时,按钮可用”


我使用的方式是用一个动作绑定与文本框编辑有关的事件,其中inputField代表文本框,primeFactorizationButton代表按钮

@IBAction func changeButton(_ sender: AnyObject) {
        if(inputField.text == ""){
            primeFactorizationButton.isUserInteractionEnabled=false
        }
        else{
            primeFactorizationButton.isUserInteractionEnabled=true
        }
    }


但是这种方法仍然不好用,好像实际上的需要是实时监听文本框的值,inputField.text,实时调整 button 的可用状态,请问我应该怎么修改代码呢?

怪我咯怪我咯2771 天前606

全部回覆(4)我來回復

  • 天蓬老师

    天蓬老师2017-04-18 09:35:27

    方法1: 設定 inputField.delegate 。在 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 中計算出最終的 text,根據 text.length 判斷是否禁用按鈕。

    方法2: 監聽通知 UITextFieldTextDidChangeNotificationNSNotificationCenter.defaultCenter.addObserverobject 傳你的 inputField, 然後在處理方法裡判斷:

    self.actionButton.enabled = self.inputField.text.length > 0;

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 09:35:27

    最近剛好做到了這個功能, 還是挺好做的, 先遵守UITextFIeld的代理協議 , 實現下面這個方法:

    - (BOOL)textFieldShouldClear:(UITextField *)textField
    {
        self.nextButton.enabled = NO;
        self.nextButton.selected = NO;
        return YES;
    }

    然後創建一個通知, 在通知的監聽方法裡做判斷就可以了:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange) name:UITextFieldTextDidChangeNotification object:nil];
    - (void)textFieldDidChange
    {
        if (self.nameField.text.length == 0 || self.IDCardField.text.length == 0 || self.contactPhoneField.text.length == 0 || self.contactPhoneField.text.length < 11 || self.addressField.text.length == 0 || self.postcodeField.text.length == 0) {
            self.nextButton.enabled = NO;
            self.nextButton.selected = NO;
        } else {
            self.nextButton.enabled = YES;
            self.nextButton.selected = YES;
        }
    }

    但是記得把通知移除掉:

    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }

    還有一個方法是用RAC, 響應式編程, 這個做更方便, 只是我暫時不會, 你也可以試試

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:35:27

    補充一個優雅的

    textField.addTarget(self, action: #selector(self.change(_:)), forControlEvents:.EditingChanged)
    func change(textField1:UITextField){
            // 进行判断
        }

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:35:27

    雷雷

    回覆
    0
  • 取消回覆