Swift 5 - Проблемы с передачей данных из класса в класс - PullRequest
0 голосов
/ 06 января 2020

В качестве упражнения для изучения Swift я создаю простое приложение, в котором вы используете ImagePickerController для выбора фотографии и получения данных о ней. Сейчас я просто извлекаю данные pixelWidth и pixelHeight из PHAsset фотографии.

Моя настройка: у меня есть класс ViewController, который я создал с помощью Storyboard, который включает в себя пользовательский интерфейс, ImagePickerController и его делегат, который после выбора фотографии обновит данные в другом классе под названием TestGlobalData.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я могу обновить переменные с ViewController до TestGlobalData, я не могу заставить его обновиться обратно на ViewController

Вот мой код. Буду признателен за любую помощь, я в полном недоумении (как уже упоминалось, я также новичок в Swift, поэтому буду благодарен за любые принципиальные вещи, которые я не получаю!)

// TestViewController.swift

class TestViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
  @IBOutlet weak var testPhotoView: UIImageView!
  @IBOutlet weak var testWidthLabel: UILabel!
  @IBOutlet weak var testHeightLabel: UILabel!
  var testWidthText: String?
  var testHeightText: String?
  var selectionFromPicker: UIImage?

  override func viewDidLoad() {
      super.viewDidLoad()
  }

  // Get imagePickerController ///////////////////////////////////////////////////////////////////

  @IBAction func getPhotoButton(_ sender: Any) {
      getImagePicker()
  }

  func getImagePicker() {
    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    imagePickerController.sourceType = .photoLibrary
    imagePickerController.allowsEditing = false
    present (imagePickerController, animated: true, completion: nil)
  }

  func imagePickerController(_ picker: UIImagePickerController,
                             didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    defer { dismiss (animated: true, completion: nil)}
    guard let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else { return }
    guard let asset = info[UIImagePickerController.InfoKey.phAsset] as? PHAsset else { return }
    selectionFromPicker = selectedImage
    let data = TestGlobalData()
    data.testData = asset   // Updates PHAsset
    data.updateData()       // Data shows as updated here
    data.pushData()         // Data shows as updated here too
    self.updateTestPhoto()  // Photo updates successfully (photo does not get passed)
    self.textToLabel()      // Assigns text to UILobel
    self.checkData()        // Data is lost and shows as nil here
  }

  // Functions  //////////////////////////////////////////////////////////////////////////////

  // Assign Text To Label
  func textToLabel() {
      testWidthLabel.text = testWidthText
      testHeightLabel.text = testHeightText
  }

  // Update  Photo To Selected
  func updateTestPhoto() {
      testPhotoView.image = selectionFromPicker
  }

  // Final Check 

// TestGlobalData.swift

class TestGlobalData {

  var testData: PHAsset?
  var testWidth = Int()
  var testHeight = Int()
  var widthInString = String()
  var heightInString = String()

  func updateData() {
      testWidth = testData!.pixelWidth
      testHeight = testData!.pixelHeight
      widthInString = String(testWidth)
      heightInString = String(testHeight)
      //widthInString and testWidth updated successfully at this point
  }

  func pushData() {
      let vc = TestViewController()
      vc.testWidthText = widthInString
      vc.testHeightText = heightInString
      //vc.testWidthText show as updated successfully here
  }
}

1 Ответ

1 голос
/ 06 января 2020

Проблема в том, что вы создаете новый экземпляр TestViewController в классе TestGlobalData, в частности в функции pushData ().

Вместо этого измените pushData на:

func pushData(vc: UIViewController) {
  vc.testWidthText = widthInString
  vc.testHeightText = heightInString
}

и измените при вызове метода также на:

data.pushData(self)  

Вот некоторые дополнительные ресурсы, которые должны помочь вам лучше понять все:)

https://code.tutsplus.com/tutorials/swift-from-scratch-an-introduction-to-classes-and-structures--cms-23197 https://www.python-course.eu/python3_class_and_instance_attributes.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...