Arrays 如何在不使用segue的情况下将大量数据从viewController传递到另一个?

Arrays 如何在不使用segue的情况下将大量数据从viewController传递到另一个?,arrays,swift,delegates,protocols,nsnotificationcenter,Arrays,Swift,Delegates,Protocols,Nsnotificationcenter,我想在不使用segue的情况下将一个UIimage从viewController传递到另一个,我一直在搜索这个问题数周。另外,我尝试使用notificationCenter、委派和协议来完成,但它对我无效,请帮助 这是一个截图,描述了我到底想做什么 另外,这是我为viewController编写的代码,我希望在单击“传递标签”按钮时从中传递thor图像 import UIKit protocol UserChosePhoto { func userHasCho

我想在不使用segue的情况下将一个UIimage从viewController传递到另一个,我一直在搜索这个问题数周。另外,我尝试使用notificationCenter、委派和协议来完成,但它对我无效,请帮助

这是一个截图,描述了我到底想做什么

另外,这是我为viewController编写的代码,我希望在单击“传递标签”按钮时从中传递thor图像

            import UIKit

  protocol UserChosePhoto {
  func userHasChosen(image: UIImage)
  }


class passingDataViewController: UIViewController {

@IBOutlet var Label: UILabel!
@IBOutlet var image1: UIImageView!

var image: UIImage? = nil
  var delegate: UserChosePhoto? = nil




override func viewDidLoad() {
    super.viewDidLoad()
    
    
  image1.image = image
   
    
    
   
}

@IBAction func passLabel(_ sender: Any) {
    
    
   func tapped() {
       if (delegate != nil) {
           self.delegate!.userHasChosen(image: image1.image!)
       }
 
 
}

}
}
这是viewController的代码,我想在其中显示thor图像

   import UIKit


   class receivingDataViewController: UIViewController, UserChosePhoto {



   @IBOutlet var label2: UILabel!
  
   @IBOutlet var image2: UIImageView!

   var usedImage: UIImage? = nil




   override func viewDidLoad() {
    super.viewDidLoad()

    
  
    
   }



   func userHasChosen(image: UIImage) {
       usedImage = image
    print("delegation: \(image)")
    
   }
    
    
    


}



          

尝试使用公共变量。它将允许您在其中存储任何您想要的内容,并从项目中的任何位置访问它。 例如,将此行放在任何类之外的任意位置:

public var userImage: UIImage? = nil
然后您可以像使用任何其他变量一样使用
userImage
在代码中的任何地方使用它

或者,如果有多个变量,则可以使用静态变量创建结构:

struct sharedVariables {
    static var userImage: UIImage? = nil
    static var userList: [Any] = [64, "Hello, world!"]
    static var integer: Int = 300
    // Or add anything you want; just make sure to start with 'static'
}
然后你可以像这样使用结构中的变量:

sharedVariables.userList

当然,有更多的方法可以满足您的要求,但这是最简单的方法。

尝试使用公共变量。它将允许您在其中存储任何您想要的内容,并从项目中的任何位置访问它。 例如,将此行放在任何类之外的任意位置:

public var userImage: UIImage? = nil
然后您可以像使用任何其他变量一样使用
userImage
在代码中的任何地方使用它

或者,如果有多个变量,则可以使用静态变量创建结构:

struct sharedVariables {
    static var userImage: UIImage? = nil
    static var userList: [Any] = [64, "Hello, world!"]
    static var integer: Int = 300
    // Or add anything you want; just make sure to start with 'static'
}
然后你可以像这样使用结构中的变量:

sharedVariables.userList

当然,有更多的方法可以满足您的要求,但这是最简单的方法。

我发现缺少一些东西,还有一些快速编码约定没有得到遵守。因此,让我们从您的
UserChosePhoto
协议开始,它非常好。但是-为什么不让代码可读

protocol PassingDataViewControllerDelegate {
      func userHasChosen(image: UIImage)
}
当然,你所拥有的一切都会起作用,但是在你名字的末尾加上委派(和你使用的VC一起),会让每个人都知道你在做什么

现在,您需要正确设置第一个视图控制器:

class PassingDataViewController: UIViewController {

    var delegate: PassingDataViewControllerDelegate? = nil
    func tapped() {
        if (delegate != nil) {
           self.delegate!.userHasChosen(image: image1.image!)
        }
    }
}
同样,非常接近您的代码-我刚刚大写了视图控制器的类名。这就是Swift编码人员的工作方式。哦,因为我更改了门户的名称,所以需要更改为

但还有一件事-您有一种第二种编码方法:

class PassingDataViewController: UIViewController {

    var delegate: PassingDataViewControllerDelegate! = nil
    func tapped() {
        delegate.userHasChosen(image: image1.image)
    }
}
这导致了一些事情。显然,委托调用更简单。但更重要的是,如果你没有在第二个视图控制器中正确设置,你的应用程序就会崩溃。(有时候,这其实是件好事!)

这就是我认为你做得不对的地方——第二个VC:

class ReceivingDataViewController: UIViewController, PassingDataViewControllerDelegate {

    var usedImage: UIImage? = nil
    let passingDataViewController = PassingDataViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        passingDataViewController.delegate = self    
    }
    func userHasChosen(image: UIImage) {
        usedImage = image
        print("delegation: \(image)")
    }
}
现在,有几件事

首先,请注意,我正在创建第一个VC的实例——这是必需的。委派始终是一种1:1的沟通方式。仍然缺少的(因为你在问题中没有提到)是如何介绍第一位VC的。我知道你不想使用segue,但是你的应用程序“流”是如何从第一个视图控制器流向第二个视图控制器的?通常没有一个segue,这意味着以模态的方式呈现它(就像使用
UIImagePickerController
)。还可以将视图控制器及其视图作为子VC和视图添加到层次结构中

第二,我告诉第一个VC,第二个VC是it的代表。如果不使用选项(
var-delegate:PassingDataViewControllerDelegate?=nil
)而强制展开内容(
var-delegate:PassingDataViewControllerDelegate!=nil
),您会看到应用程序崩溃,因为第二个VC不是第一个VC的代理,而没有
passingDataViewController.delegate=self

最后说明:

当我写这篇文章时,@TLG_Codin提供了一个答案。它可以工作——但是,*作为公共变量声明的
userImage
在哪里?在两个地方之一:

  • 在全球范围内,如在一个类之外。这就是所谓的单身,在做这件事时要非常非常小心。因为它是全球性的,所以应用程序中的任何地方都可以更改它。这就是为什么单身人士通常不受欢迎的原因
  • 在你的第一个VC里面。问题是——你是如何介绍这个VC的?再说一次,你提到你不想使用segue。所以现在回到我的笔记,关于从第二个VC中显示第一个VC,或者将VC及其视图添加到层次结构中。不管怎样?委派工作非常完美,当您希望告诉感兴趣的类(在本例中是第二个VC)
    userImage
    已更改时,您可以这样做

    • 我发现有一些东西缺失,还有一些快速编码约定没有得到遵守。因此,让我们从您的
      UserChosePhoto
      协议开始,它非常好。但是-为什么不让代码可读

      protocol PassingDataViewControllerDelegate {
            func userHasChosen(image: UIImage)
      }
      
      当然,你所拥有的一切都会起作用,但是在你名字的末尾加上委派(和你使用的VC一起),会让每个人都知道你在做什么

      现在,您需要正确设置第一个视图控制器:

      class PassingDataViewController: UIViewController {
      
          var delegate: PassingDataViewControllerDelegate? = nil
          func tapped() {
              if (delegate != nil) {
                 self.delegate!.userHasChosen(image: image1.image!)
              }
          }
      }
      
      同样,非常接近您的代码-我刚刚大写了视图控制器的类名。这就是Swift编码人员的工作方式。哦,因为我更改了门户的名称,所以需要更改为

      但还有一件事-您有一种第二种编码方法:

      class PassingDataViewController: UIViewController {
      
          var delegate: PassingDataViewControllerDelegate! = nil
          func tapped() {
              delegate.userHasChosen(image: image1.image)
          }
      }
      
      这导致了一些事情。显然,委托调用更简单。但更重要的是,如果你没有在第二个视图控制器中正确设置,你的应用程序就会崩溃。(有时候,这其实是件好事!)

      这就是我认为你做得不对的地方——第二个VC:

      class ReceivingDataViewController: UIViewController, PassingDataViewControllerDelegate {
      
          var usedImage: UIImage? = nil
          let passingDataViewController = PassingDataViewController()
      
          override func viewDidLoad() {
              super.viewDidLoad()
              passingDataViewController.delegate = self    
          }
          func userHasChosen(image: UIImage) {
              usedImage = image
              print("delegation: \(image)")
          }
      }
      
      现在,有几件事

      首先,请注意,我正在创建第一个VC的实例——这是必需的。委派始终是一种1:1的沟通方式。仍然缺少的是(因为你在问题中没有提到)第一个VC是如何