কোনও ইউআইটিেক্সটফিল্ড পরিবর্তন হলে আমি কীভাবে চেক করব?


290

আমি যখন পাঠ্যের ক্ষেত্রটি পরিবর্তন হয় তখন টেক্সটভিউয়ের জন্য ব্যবহৃত ফাংশনের সমতুল্য তা যাচাই করার চেষ্টা করছি - textViewDidChangeএখন পর্যন্ত আমি এটি করেছি:

  func textFieldDidBeginEditing(textField: UITextField) {
        if self.status.text == "" && self.username.text == "" {
            self.topRightButton.enabled = false
        } else {   
            self.topRightButton.enabled = true
        }
    }

কোন ধরণের কাজ, তবে topRightButtonপাঠ্য ক্ষেত্রটি টিপানোর সাথে সাথেই সক্ষম করা হয়েছে, আমি চাই যখন পাঠ্যটি আসলে টাইপ করা হয় কেবল তখনই এটি সক্ষম হয়?

উত্তর:


739

স্যুইফ্ট

সুইফট 4.2

textfield.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: .editingChanged)

এবং

@objc func textFieldDidChange(_ textField: UITextField) {

}

সুইফট 3 এবং দ্রুত 4.1

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: .editingChanged)

এবং

func textFieldDidChange(_ textField: UITextField) {

}

সুইফট ২.২

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

এবং

func textFieldDidChange(textField: UITextField) {
    //your code
}

উদ্দেশ্য গ

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

এবং টেক্সটফিল্ডডিড চেঞ্জ পদ্ধতিটি

-(void)textFieldDidChange :(UITextField *) textField{
    //your code
}

এটি আমার জন্য ক্র্যাশ হয়ে গেছে এবং আমি বুঝতে পারছি না কেন।
লেবি রবার্টস

1
একাধিকবার পরীক্ষা করা হয়েছে। ডেলিগেটটি এর অভ্যন্তরের আগেই সেট করা থাকে viewDidLoad। ক্রিয়াটি একই চিঠির জন্য চিঠি। একটি কীবোর্ড বোতাম টিপানোর সাথে সাথে অ্যাপটি ক্র্যাশ হয়ে যায়। সম্পাদনা করুন: এটি বের করে! ক্রমের ভিতরে সেমিকোলনটি অনুপস্থিত। আমি ধরে নিয়েছি এটি কেবল ফাংশন নামের মতোই হবে।
লেবি রবার্টস

@ ফাওয়াদমাসুদ এটি এখন এক্সকোড 7 এর সাথে আইওএস 9 এর সুইফট 2.0 তে কিছুই করতে পারে না এটি অবহিত করা হয়েছে বা এটি ঠিক করার বর্তমান উপায়টি জানেন?
কোডি তাঁত

1
@ বিবিসি হ্যাঁ আপনাকে একটি ভিউয়ের ভিতরে সমস্ত পাঠ্যক্ষেত্রটি লুপ করতে হবে।
ফাওয়াদ মাসুদ

1
সুইফট ৪.২ এর জন্য: টেক্সটফিল্ড.এডিডিটরেট (স্ব, ক্রিয়া: # নির্বাচক (ViewControllerr.textFieldDidChange (_ :)), এর জন্য: ইউআইসিএন্ট্রোল.এভেন্ট.এডিটিংচেনজড)
প্রস্থানটি

128

আপনি ইন্টারফেস বিল্ডারে এই সংযোগটি তৈরি করতে পারেন।

  1. আপনার স্টোরিবোর্ডে, পর্দার শীর্ষে সহকারী সম্পাদককে (মাঝখানে দুটি বৃত্ত) ক্লিক করুন। সহকারী সম্পাদক নির্বাচিত হয়েছেন

  2. ইন্টারফেস বিল্ডারে টেক্সটফিল্ডে Ctrl + ক্লিক করুন।

  3. সহকারী ভিউতে আপনার ভিউ কন্ট্রোলার ক্লাসের ভিতরে এডিটিং চ্যাঞ্জড থেকে টেনে আনুন। সংযোগ তৈরি হচ্ছে

  4. আপনার ফাংশনটির নাম দিন (উদাহরণস্বরূপ "textDidChange") এবং সংযুক্ত ক্লিক করুন। নামকরণ কার্য


3
এটি একটি দুর্দান্ত সমাধান বিশেষত বিশেষত যদি কোনও টেবিলভিউসিলের কোনও ইউআইটিেক্সটফিল্ড নিয়ে কাজ করে যা একটি পৃথক ডেটাসোর্স দ্বারা পরিচালিত হয়। এই পদ্ধতির দ্বারা ভিউকন্ট্রোলারকে সরাসরি প্রতিক্রিয়া জানাতে অনুমতি দেওয়া হয় (এইভাবে ডেটাসোর্সটিতে ক্রিয়াটি প্রতিক্রিয়া জানাতে এবং প্রেরণ করতে হবে না)।
wuf810

1
দুর্দান্ত - একটি বিরক্তিকর সমস্যার সহজ সমাধান। আপনি অবশ্যই একাধিক পাঠ্য ক্ষেত্রটি লিঙ্ক করতে পারেন
জেরেমি অ্যান্ড্রুজ

1
সম্ভবত উপরের চেয়ে সম্ভবত আরও ভাল উত্তর কারণ যোগ করা @objc ফানক দূর করে।
ম্যাথু ব্র্যাডশো

গুড আইডিয়া, আমি ইভেন্ট ডিডএন্ডএডিটিং ব্যবহার করি
পুজি ওয়াহানো

এটিই সেরা সমাধান। ধন্যবাদ @ আরমুনি!
জোনাথন

63

সুইফ্ট 5.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: .editingChanged)

এবং হ্যান্ডেল পদ্ধতি:

@objc func textFieldDidChange(_ textField: UITextField) {

}

সুইফট 4.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

এবং হ্যান্ডেল পদ্ধতি:

@objc func textFieldDidChange(_ textField: UITextField) {

}

সুইফট 3.0

textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

এবং হ্যান্ডেল পদ্ধতি:

func textFieldDidChange(textField: UITextField) { 

}

29

আমি এখন পর্যন্ত যেভাবে এটি পরিচালনা করেছি: ইন UITextFieldDelegate

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
    // text hasn't changed yet, you have to compute the text AFTER the edit yourself
    let updatedString = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string)

    // do whatever you need with this updated string (your code)


    // always return true so that changes propagate
    return true
}

সুইফট 4 সংস্করণ

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
    return true
}

1
পাঠ্যক্ষেত্রটি খালি থাকলে এবং ব্যবহারকারী ব্যাকস্পেসে ক্লিক করলে এটি ডাকা হবে না।
ম্যাথু মিচেল



7

সুইফট .1.০.১+ (অন্যান্য কিছু সুইফট 3.0.০ উত্তর উত্তর নেই)

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

func textFieldDidChange(_ textField: UITextField) {

}

6

টেক্সটফিল্ড (_: shouldChageCharactersIn: রিপ্লেসমেন্ট স্ট্রিং :) আমার জন্য এক্সকোড 8, সুইফট 3 এ কাজ করেছেন যদি আপনি প্রতিটি একক কী চাপতে চান তবে।

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // Whatever code you want to run here.
    // Keep in mind that the textfield hasn't yet been updated,
    // so use 'string' instead of 'textField.text' if you want to
    // access the string the textfield will have after a user presses a key

    var statusText = self.status.text
    var usernameText = self.username.text

    switch textField{
    case self.status:
        statusText = string
    case self.username:
        usernameText = string
    default:
        break
    }

    if statusText == "" && usernameText == "" {
        self.topRightButton.enabled = false
    } else {   
        self.topRightButton.enabled = true
    }

    //Return false if you don't want the textfield to be updated
    return true
}

5

সুইফট 4

সাথে সামঞ্জস্য UITextFieldDelegate

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // figure out what the new string will be after the pending edit
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)

    // Do whatever you want here


    // Return true so that the change happens
    return true
}

4

আপনি এই প্রতিনিধি পদ্ধতিটি ইউআইটিেক্সটফিল্ডডেলিগেট থেকে ব্যবহার করতে পারেন। এটি প্রতিটি চরিত্রের পরিবর্তনের সাথে আগুন দেয়।

(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)

তবে এই পরিবর্তন আগত হওয়ার আগে কেবল আগুনই হয় (সত্যিকার অর্থে, আপনি যদি এখান থেকে সত্য প্রত্যাবর্তন করেন তবেই পরিবর্তন করা হয়)।


1
এটি কীভাবে রচনা করা উচিত কারণ আমিও এই পদ্ধতিটি চেষ্টা করেছি এবং একই সমাধানে আসি যেখানে এটি কেবল একবার টেক্সটফিল্ড সক্রিয় হওয়ার পরে পরিবর্তিত হয়, একবার পাঠ্যটি আসলে পরিবর্তিত হয় না ??

আপনি যখন উপরের প্রতিনিধি পদ্ধতিটি প্রয়োগ করেন, প্রতিবার আপনি আপনার পাঠ্য পরিবর্তন করলে তা আগুন ধরে যায়। আপনাকে কেবল এই কোডটি যুক্ত করতে হবে, self.textfield.delegate = স্ব
আবুবকর দার

আমার জন্য, এই পদ্ধতিটি কার্যকর হয়নি কারণ আপনি পদ্ধতির অভ্যন্তরে পাঠ্যক্ষেত্রটি খালি ছিল কিনা তা পরীক্ষা করতে পারবেন না। প্রাথমিকভাবে কারণ এটি পাঠ্যক্ষেত্র পরিবর্তন করতে পারে তার উপর নির্ভর করে সত্য / মিথ্যা প্রত্যাবর্তন করে। সুতরাং পাঠ্যক্ষেত্রটি শূন্য হয়ে যাওয়ার আগে ইভেন্টটি ছড়িয়ে পড়ে।
লেবি রবার্টস

@ লেভিরোবার্টস, এই পদ্ধতির অভ্যন্তরে আপনার কাছে পাঠ্যক্ষেত্রের একটি উল্লেখ রয়েছে। সুতরাং আপনি পাঠ্যক্ষেত্র.টি পাঠ্য ফাঁকা আছে কিনা তা পরীক্ষা করতে পারেন।
আবুবকর দার

আপনি বুঝতে পারছেন না। যখন এটি খালি থাকে, .isEmptyপদ্ধতিটি সত্যের সাথে সমান হয় না যতক্ষণ না এই পদ্ধতির সত্যায় ফেরার সুযোগ থাকে; অ্যাপ্লিকেশনটিকে বলার জন্য যে পাঠ্যক্ষেত্রটি পরিবর্তন করা উচিত।
লেবি রবার্টস

3

RxSwift ব্যবহার করতে পারেন?

প্রয়োজন

pod 'RxSwift',    '~> 3.0'
pod 'RxCocoa',    '~> 3.0'

স্পষ্টতই আমদানি যুক্ত করুন

import RxSwift
import RxCocoa

সুতরাং আপনি একটি আছে textfield : UITextField

let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
            onNext: {(string: String?) in
                print(string!)
        })

আপনার অন্যান্য 3 পদ্ধতি আছে ..

  1. onError
  2. onCompleted
  3. onDisposed
  4. onNext

টেক্সটফিল্ড প্রথম প্রতিক্রিয়াশীল হয়ে ওঠার পরেও কেবল আসল পরিবর্তনের ইভেন্টগুলি পেতে, আপনাকে পাঠ্যে স্বতন্ত্রঅন্টেল চেঞ্জড ব্যবহার করতে হবে।
RealNmae

1

সুইফট 4

textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)

@objc func textIsChanging(_ textField:UITextField) {

 print ("TextField is changing")

}

আপনি একবার পরিবর্তন করতে চান যদি একবার ব্যবহারকারী পুরোপুরি টাইপ করেন (এটি একবার ব্যবহারকারীকে কীবোর্ড বরখাস্ত করে বা এন্টার টিপবে)।

textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)

 @objc func textDidChange(_ textField:UITextField) {

       print ("TextField did changed") 
 }

1
txf_Subject.addTarget(self, action:#selector(didChangeFirstText), for: .editingChanged)

@objc func didChangeText(textField:UITextField) {
    let str = textField.text
    if(str?.contains(" "))!{
        let newstr = str?.replacingOccurrences(of: " ", with: "")
        textField.text = newstr
    }
}

@objc func didChangeFirstText(textField:UITextField) {
    if(textField.text == " "){
        textField.text = ""
    }
}

1

আপনার এই পদক্ষেপগুলি অনুসরণ করা উচিত:

  1. পাঠ্যক্ষেত্রে একটি আউটলেট রেফারেন্স করুন
  2. নিয়ামক শ্রেণিতে AssignUITextFieldDelegate
  3. আপনার টেক্সটফিল্ড.ডিলেগেট কনফিগার করুন
  4. আপনার যা প্রয়োজন তা কার্যকর করুন lement

কোডের উদাহরণ:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var yourTextFiled : UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        yourTextFiled.delegate = self
    }


    func textFieldDidEndEditing(_ textField: UITextField) {
        // your code
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // your code
    }

    .
    .
    .
}

0

আপনি সুইফট 3textField text change listener ব্যবহার করে এভাবে যুক্ত করতে পারেন :

আপনার ক্লাস হিসাবে ঘোষণা করুন UITextFieldDelegate

override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self

    textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}

তারপরে কেবল traditionতিহ্যগতভাবে একটি পাঠ্যফিল্ডশোল্ডএন্ড সম্পাদনা ফাংশন যুক্ত করুন:

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
        return true 
}

0

সুইফট 4.2

ভিউডিডোডে এটি লিখুন

// to detect if TextField changed
TextField.addTarget(self, action: #selector(textFieldDidChange(_:)),
                                   for: UIControl.Event.editingChanged)

এটি বাইরের ভিডিডলিড লিখুন

@objc func textFieldDidChange(_ textField: UITextField) {
    // do something
}

আপনি ইভেন্টটি ইউআইসিএন্ট্রোল.এভেন্ট.এডিটিংডিজবেইগিন বা আপনি কখন আবিষ্কার করতে চান তা পরিবর্তন করতে পারেন।


0

আপনি যদি কোনও সুইফ্টইউআই সমাধানে আগ্রহী হন তবে এটি আমার পক্ষে কাজ করছে:

 TextField("write your answer here...",
            text: Binding(
                     get: {
                        return self.query
                       },
                     set: { (newValue) in
                        self.fetch(query: newValue) // any action you need
                                return self.query = newValue
                      }
            )
  )

আমাকে বলতে হবে এটি আমার ধারণা নয়, আমি এটি এই ব্লগে পড়েছি: সুইফটইউ বাইন্ডিং: একটি খুব সাধারণ কৌশল


0

আপনার ইউআইটিেক্সটফিল্ডে অ্যাডগার্টটি বাঁধাই সম্ভব না হলে, আমি আপনাকে পরামর্শ দিচ্ছি যে উপরে উল্লিখিত মতামতগুলির মধ্যে একটিকে আবদ্ধ করুন, এবং কাঁধে চ্যাটারসআইটার পদ্ধতিটির শেষে প্রয়োগের জন্য কোডটি সন্নিবেশ করানোর পরামর্শ দিন।

nameTextField.addTarget(self, action: #selector(RegistrationViewController.textFieldDidChange(_:)), for: .editingChanged)

@objc func textFieldDidChange(_ textField: UITextField) {
    if phoneNumberTextField.text!.count == 17 && nameTextField.text!.count > 0 {
        continueButtonOutlet.backgroundColor = UIColor(.green)
    } else {
        continueButtonOutlet.backgroundColor = .systemGray
    }
}

এবং কল করতে হবে চ্যাঞ্জচ্যাকার্টারস ইন ফান।

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    guard let text = textField.text else {
        return true
    }
    let lastText = (text as NSString).replacingCharacters(in: range, with: string) as String

    if phoneNumberTextField == textField {
        textField.text = lastText.format("+7(NNN)-NNN-NN-NN", oldString: text)
        textFieldDidChange(phoneNumberTextField)
        return false
    }
    return true
}

-1

দ্রুত 4

দ্য ডিডলয়েডে ():

    //ADD BUTTON TO DISMISS KEYBOARD

    // Init a keyboard toolbar 
    let toolbar = UIView(frame: CGRect(x: 0, y: view.frame.size.height+44, width: view.frame.size.width, height: 44))
    toolbar.backgroundColor = UIColor.clear

    // Add done button
    let doneButt = UIButton(frame: CGRect(x: toolbar.frame.size.width - 60, y: 0, width: 44, height: 44))
    doneButt.setTitle("Done", for: .normal)
    doneButt.setTitleColor(MAIN_COLOR, for: .normal)
    doneButt.titleLabel?.font = UIFont(name: "Titillium-Semibold", size: 13)
    doneButt.addTarget(self, action: #selector(dismissKeyboard), for: .touchUpInside)
    toolbar.addSubview(doneButt)

    USDTextField.inputAccessoryView = toolbar

এই ফাংশন যুক্ত করুন:

    @objc func dismissKeyboard() {
      //Causes the view (or one of its embedded text fields) to resign the first responder status.
      view.endEditing(true)
    }

-1

নতুন কাস্টম শ্রেণীর মেটিরিয়াল টেক্সটফিল্ড.সুইফ্ট তৈরি করুন

class MaterialTextfield: UITextField,UITextFieldDelegate {

var bottomBorder = UIView()
var shouldShowEditing = false

override func awakeFromNib() {

    // Setup Bottom-Border

    self.delegate = self
    self.translatesAutoresizingMaskIntoConstraints = false

    bottomBorder = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
    bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1) // Set Border-Color
    bottomBorder.translatesAutoresizingMaskIntoConstraints = false

    addSubview(bottomBorder)

    bottomBorder.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    bottomBorder.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    bottomBorder.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
    bottomBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true // Set Border-Strength

}
@IBInspectable var hasError: Bool = false {
    didSet {
        if (hasError) {
            bottomBorder.backgroundColor = UIColor.red//error color
        } else {
            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
        }

    }
}
@IBInspectable var showEditing: Bool = false{
    didSet {
        if (showEditing) {
            bottomBorder.backgroundColor = UIColor(rgb: 0x56B5CA)//active color
        } else {
            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
        }

    }

}

func textFieldDidBeginEditing(_ textField: UITextField) {//listen to on edit event
    showEditing = !self.showEditing
}
func textFieldDidEndEditing(_ textField: UITextField) {//listen to on end edit event
    showEditing = !self.showEditing
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {//listen to return button event
    textField.resignFirstResponder() // return button will close keyboard
    return true
}

}

সমস্ত যথাযোগ্য সম্মানের সাথে, এটি একটি ভয়াবহ সমাধান। তিনি কেবল যাচাই করতে চান যে UITextFieldকোনওর এর মূল্য আপডেট হয়েছে কিনা - কেন এই সাধারণ সমস্যা সমাধানের জন্য অতিরিক্ত জটিল শ্রেণি তৈরি করা হচ্ছে?
গিলহর্ম মাতুয়েলা

@ গুয়েলহেরম্যাটুয়েল্লা এটি ক্ষেত্রটি আমার প্রয়োজন এবং পূরণ করা হয়েছে কিনা তা জানতে ব্যবহারকারীদের পক্ষে শেষের কোডের চেয়ে বেশি। একই সমস্যা সমাধানের জন্য এটি একটি ভিন্ন পদ্ধতি। এটি মূলত আমার কাস্টম সম্পদ
মুহাম্মদ আশাইরাফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.