如何将变量从ViewController类传递给其他Struct?

时间:2017-09-17 07:23:15

标签: swift class struct communication

我不知道如何将数据从类传递到另一个结构。这是我的ViewController.swift文件。我有另一个名为Meme.swift的文件,用于保存结构。我试图将结构放在ViewController.swift文件以及Meme.swift文件中,但我无法访问像topTextField.textlowTextField.text这样的值并在结构中使用它们。谁能帮我这个? 视图控制器: 导入UIKit

类ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UITextFieldDelegate {     @IBOutlet weak var cameraButton:UIBarButtonItem!

@IBOutlet weak var bottomTextField: UITextField!
@IBOutlet weak var topTextField: UITextField!
@IBOutlet weak var imagePickerView: UIImageView!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var actionButton: UIBarButtonItem!
let bottomTextFieldDelegate = BottomTextFieldDelegate()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    topTextField.text = "TOP"
    bottomTextField.text = "BOTTOM"
    topTextField.delegate = self
    bottomTextField.delegate = self.bottomTextFieldDelegate

}

func textFieldDidBeginEditing(_ textField: UITextField) {
    topTextField.text = ""
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    textField.resignFirstResponder()
    actionButton.isEnabled = true
    return true
}

@IBAction func shareAction(_ sender: Any) {
    let image = generateMemedImage()
    let controller = UIActivityViewController(activityItems: [image as Any], applicationActivities: nil)
    self.present(controller, animated: true, completion: nil)
    controller.completionWithItemsHandler = {(activityType: UIActivityType?, completed:Bool, returnedItems:[Any]?, error: Error?) in

        if !completed {
            debugPrint("cancelled")
            return
        }else{
            self.save()
            self.dismiss(animated: true, completion: nil)
        }
    }
}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    cameraButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.camera)
    configureTextField(textField: topTextField)
    configureTextField(textField: bottomTextField)
    topTextField.textAlignment = .center
    bottomTextField.textAlignment = .center
    subscribeToKeyboardNotifications()
    actionButton.isEnabled = false

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    unsubscribeFromKeyboardNotifications()
}

func configureTextField(textField: UITextField) {
    textField.defaultTextAttributes = memeTextAttributes
}


func save() -> Meme {
    // Create the meme
    let memedImage = generateMemedImage()
    let meme = Meme(topText: topTextField.text!, bottomText: bottomTextField.text!, originalImage: imageView.image!, memedImage: memedImage)

    return meme
}

func generateMemedImage() -> UIImage {

    // TODO: Hide toolbar and navbar
    navigationController?.setToolbarHidden(true, animated: true)
    self.navigationController?.isNavigationBarHidden = true

    // Render view to an image
    UIGraphicsBeginImageContext(self.view.frame.size)
    view.drawHierarchy(in: self.view.frame, afterScreenUpdates: true)
    let memedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    // TODO: Show toolbar and navbar
    navigationController?.setToolbarHidden(false, animated: false)
    self.navigationController?.isNavigationBarHidden = false

    return memedImage
}


func keyboardWillShow(_ notification:Notification) {

    view.frame.origin.y = 0 - getKeyboardHeight(notification)
}

func keyboardWillHide(_ notification:Notification) {

    view.frame.origin.y = 0 

}

func getKeyboardHeight(_ notification:Notification) -> CGFloat { //getting the height of keyboard and use it for func keyboardWillShow to relocate
    //the keyboard using keyboardWillShow function

    let userInfo = notification.userInfo
    let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue // of CGRect
    return keyboardSize.cgRectValue.height
}

func subscribeToKeyboardNotifications() { //setting up the obeserver to be notified when keyboard is shown or not, then execute keyboardWillShow function

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: .UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: .UIKeyboardWillHide, object: nil)
}

func unsubscribeFromKeyboardNotifications() { //unsubscribe the notification

    NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil)
}
//setting the arributes of the text
let memeTextAttributes:[String:Any] = [
    NSStrokeColorAttributeName: UIColor.black,
    NSForegroundColorAttributeName: UIColor.white,
    NSFontAttributeName: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
    NSStrokeWidthAttributeName: 3,]


@IBAction func pickAnImageFromAlbum(_ sender: Any) {
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .photoLibrary
    present(imagePicker, animated: true, completion: nil)
    }


@IBAction func pickAnImageFromCamera(_ sender: Any) {

    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .camera
    present(imagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imagePickerView.image = image
        imagePickerView.contentMode = .scaleAspectFit
        dismiss(animated: true, completion: nil)
    }

}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController){
    dismiss(animated: true, completion: nil)
}

}

BottomFieldDelegate:

导入基金会 导入UIKit

class BottomTextFieldDelegate:NSObject,UITextFieldDelegate {

func textFieldDidBeginEditing(_ textField: UITextField) {
    textField.text = ""
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let viewController = ViewController()
    textField.resignFirstResponder()
    viewController.view.endEditing(true)
    let actionButton = viewController.actionButton
    actionButton?.isEnabled = true
    return true
}

}

1 个答案:

答案 0 :(得分:1)

首先,您需要将此函数(如save()和generateMemedImage())移动到ViewController类中,然后您可以访问topTextField.text和lowTextField.text

修改你的结构,如下所示,不要将nsobject放在struct

struct Meme {
    var topText: String
    var bottomText: String
    var memedImage: UIImage
    var originalImage: UIImage

    init(topText: String, bottomText: String, originalImage: UIImage, memedImage: UIImage) {
        self.topText = topText
        self.bottomText = bottomText
        self.originalImage = originalImage
        self.memedImage = memedImage
    }
}

从Meme结构中删除save()并将该代码放入Viewcontroller文件中。 修改返回Meme结构对象的函数。

func save() -> Meme {
        // Create the meme
        let meme = Meme(topText: topTextField.text!, bottomText: bottomTextField.text!, originalImage: imageView.image!, memedImage: memedImage)
        return meme   
}

你可以像下面那样存储在数组中。

let array:[Meme] = []
array.append(save())