Arrays 如何在不使用segue的情况下将大量数据从viewController传递到另一个?
我想在不使用segue的情况下将一个UIimage从viewController传递到另一个,我一直在搜索这个问题数周。另外,我尝试使用notificationCenter、委派和协议来完成,但它对我无效,请帮助 这是一个截图,描述了我到底想做什么 另外,这是我为viewController编写的代码,我希望在单击“传递标签”按钮时从中传递thor图像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
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是如何