如何从另一个类导入或访问UITextField



我在主VC中有UITextField的Outlet,我想从另一个类访问它的文本。。。有关更多澄清,请参阅下面的代码:

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语言的初学者和新手。

提前谢谢。

编辑:

Elia回答如下:

产品管理类+扩展

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类

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提供任何值!为什么?

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 ?? ""
}
}

这将把您的输入文本存储到一个变量中,基本上带有侦听编辑更改。

如果我没有错的话,您可以在ProductManagement类中使用UploadImage。将函数属性添加到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)

}
}
}



}

并在CCD_ 4类中调用它,如下所示。

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

编辑:

在得到你的评论后,我决定最好的方法是使用Notification,你在ProductManagement类中使用UITextField,所以不需要在XUpload中处理它们的delegate方法

描述通知名称

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类中,它将为您工作。textfield中的文本会更新XUpload类中的每一次更改。

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

最新更新