Как импортировать или получить доступ к UITextField из другого класса - PullRequest
2 голосов
/ 12 июля 2020

У меня есть выход UITextField в основном V C, и я хочу получить доступ к его тексту из другого класса ... для получения дополнительных разъяснений см. Мой код ниже:

class ProductManagement : UIViewController, UITextFieldDelegate{

    @IBOutlet weak var ProductName: UITextField!

}

, и я хочу прочтите текст в классе ниже

import Firebase
import FirebaseStorage

class XUpload {
    
    
    static func UploadImage(Image : UIImage, Completion : @escaping (_ url : String)->()) {
        
        guard let imageData = Image.pngData()  else { return }
                let storage = Storage.storage().reference()
        let pathRef = storage.child("Images/Products")
        
        let imageRef = pathRef.child(   // I want the product name to be written here!  )
        

            imageRef.putData(imageData, metadata: nil) { (meta, error) in
            imageRef.downloadURL { (url, error) in
                print (url as Any)
                                                
            }
        }
    }
    
    
    
}

Я попытался создать собственный протокол для делегирования UITextField, но проблема в том, что я не смог согласовать его внутри класса XUpload !!

Пожалуйста, напишите для меня каким должен быть мой код, потому что я новичок и новичок в языке Swift.

Спасибо заранее.

РЕДАКТИРОВАТЬ:

Ответ Элиа применен ниже:

ProductManagement Class + Extension

    class ProductManagement : UIViewController, UITextFieldDelegate{
    
    override func viewDidLoad() {
            super.viewDidLoad()
        
            self.ProductName.delegate = self
    }
    
    
        @IBOutlet weak var ProductName: UITextField!
        @objc private func textFieldDidChange(_ sender: UITextField) {
            NotificationCenter.default.post(name: .PnameInputText, object: nil, userInfo: ["text": sender.text!])
        }
    
    
    }


extension Notification.Name {
    public static var PnameInputText = Notification.Name("PnameInputText")
}

XUpload Class

import Firebase
import FirebaseStorage

class XUpload {
    
    private init() {
        NotificationCenter.default.addObserver(self, selector: #selector(handle(_:)), name: .PnameInputText, object: nil)
    }
    
    public static var shared = XUpload()
    
    var textFieldText : String = "" {
        didSet {print("updated value > ", textFieldText)}
    }
    

    @objc private func handle(_ sender: Notification) {
        if let userInfo = sender.userInfo as NSDictionary?, let text = userInfo["text"] as? String {
        textFieldText = text
        }
    }
        
    
    
    
    static func UploadImage(Image : UIImage, Completion : @escaping (_ url : String)->()) {
        
        guard let imageData = Image.pngData()  else { return }
        
        let storage = Storage.storage().reference()
        let pathRef = storage.child("Images/Products")
        let imageRef = pathRef.child("img_"+shared.textFieldText)
        print("var of textFieldText value: " + shared.textFieldText)  //print nothing... empty value!!
        
                
        imageRef.putData(imageData, metadata: nil) { (meta, error) in
            imageRef.downloadURL { (url, error) in
                print ("Image uploaded to this link >> " + url!.description)
                guard let str = url?.absoluteString else { return }
                Completion (str)
            }
        }
    }
    
}



extension UIImage {
    
    func upload(completion : @escaping (_ url : String) ->()) {
        XUpload.UploadImage(Image: self) { (ImageURL) in completion (ImageURL)
                        
        }
    }
}

Как вы можете видите, что Центр уведомлений не присвоил переменной var textFieldText значение! почему ??

1 Ответ

1 голос
/ 12 июля 2020
class ProductManagement : UIViewController, UITextFieldDelegate{
    var productInputText: String = ""
    @IBOutlet weak var ProductName: UITextField!

    override func viewDidLoad() { 
        super.viewDidLoad() 
        ProductName.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
    }

    @objc private func textFieldDidChange(_ sender: UITextField) {
         productInputText = sender.text ?? ""
    }

}

Это сохранит ваш вводимый текст в переменной в основном с изменениями редактирования прослушивания.

И если я не ошибаюсь, вы используете UploadImage в классе ProductManagement. Добавьте свойство функции в UploadImage, как показано ниже

class XUpload {
    
    
    static func UploadImage(Image : UIImage, productName: String,  Completion : @escaping (_ url : String)->()) {
        
        guard let imageData = Image.pngData()  else { return }
                let storage = Storage.storage().reference()
        let pathRef = storage.child("Images/Products")
        
        let imageRef = pathRef.child(   // I want the product name to be written here!  )
        

            imageRef.putData(imageData, metadata: nil) { (meta, error) in
            imageRef.downloadURL { (url, error) in
                print (url as Any)
                                                
            }
        }
    }
    
    
    
}

, и вызовите его в классе ProductManagement, как показано ниже.

XUpload.UploadImage(image: myImage, productName: productInputText, Completion: { 

}

EDIT:

После получения комментарий, я решил, что лучше всего использовать Notification, вы используете UITextField в классе ProductManagement, поэтому нет необходимости обрабатывать их метод delegate в XUpload

Опишите имя уведомления

extension Notification.Name {
    public static var TextChange = Notification.Name("TextChange")
}

В ProductManagement, textDidChange текст сообщения метода в Notification

@objc private func textFieldDidChange(_ sender: UITextField) {
        NotificationCenter.default.post(name: .TextChange, object: nil, userInfo: ["text": sender.text])
    }

Я конвертирую ваш XUpload класс в Singleton класс.

class XUpload {
    
    private init() {
        NotificationCenter.default.addObserver(self, selector: #selector(handle(_:)), name: .TextChange, object: nil)
    }
    
    public static var Shared = XUpload()

    @objc private func handle(_ sender: Notification) {
        if let userInfo = sender.userInfo as NSDictionary?, let text = userInfo["text"] as? String {
            textFieldText = text
        }
        
    }
    
    var textFieldText: String = "" {
        didSet {
            print("updated value > " , textFieldText)
        }
    }
    
    static func uploadImage() {
        // use updated textfield text with textFieldText
    }
    
    
}

Затем сохраните переменную в классе ProductManagement как одноэлементный объект, и это сработает для вас. Текст в текстовом поле обновляется при каждом изменении в классе XUpload.

class ProductManagement : UIViewController, UITextFieldDelegate{
   var staticVariable = XUpload.Shared
} 
...