【问题标题】:How to import or access UITextField from another Class如何从另一个类导入或访问 UITextField
【发布时间】:2020-11-01 10:36:44
【问题描述】:

我在主 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 答案应用如下:

ProductManagement 类 + 扩展

    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 赋值!为什么??

【问题讨论】:

  • 您想从哪里访问文本字段?
  • @luckystars 在 XUpload 类里面 (static func UploadImage)...提前谢谢你的帮助

标签: swift inheritance protocols subclass


【解决方案1】:
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)
                                                
            }
        }
    }
    
    
    
}

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

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

}

编辑:

在收到您的评论后,我决定最好的方法是使用 Notification,您在 ProductManagement 类中使用 UITextField,因此无需在 XUpload 中处理它们的 delegate 方法

描述通知名称

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

ProductManagementtextDidChange 方法中发布文本到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
} 

【讨论】:

  • 不,我想在 Upload 类中实现 UIImage 的扩展以上传图像,然后在 ProductManagement 中调用它......(这就是为什么我想将 UITextField 输入带到 XUPload 类......现在请告诉我如何在 XUpload 类中调用 var productInputText?我确实编写了 addTarget 代码,但老实说我不知道​​如何在 XUpload 类中调用它...我已经在 XUpload 类中为你提到了我想放置UITextFiled 输入作为备注,请检查我在课堂上的评论并修改您的答案
  • 嘿@Let.Simoo 我在答案的末尾进行了编辑。它对你有用,我描述了为什么你应该通知但在你的 XUpload 类中没有委托。希望你为你工作
  • 亲爱的@elia 感谢您更新您的答案...我一步一步地遵循您的方法...为了清楚起见,我在执行您的说明后复制了整个代码但不幸的是我没有得到我想要的:(
  • 编辑你的答案并复制粘贴你尝试过的所有代码,我会在我的编辑中修复它
  • 嘿 @Let.Simoo 你忘了为 UITextField 添加目标,请添加并试一试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2012-01-04
  • 2012-05-06
  • 1970-01-01
相关资源
最近更新 更多