Swift - 通过委托将 UIImage 传递给 UIImageView
Swift - Passing an UIImage to an UIImageView via delegation
我没主意了,我不知道如何解决这个问题。任何帮助将不胜感激。
我遇到了以下情况:
- 指向嵌入在 NavController 中的 CollectionView 的 MainViewController
- CollectionView 指向一个 DetailViewController
- DetailViewController 显示在 CollectionView 中选择的完整图片,并有一个将此图像传递给 MainViewController 的按钮。协议和委托用于此
- 此图像现在应显示在 MainViewController 的 UIImageView 中
代表团工作。我的 MainViewController 中有一个 UIImage。但是:UIImageView 为零。因此,当我将所选图像设置为 imageView.image 时,它会崩溃。 MainViewController 已初始化,我还看到了我的默认图片。请参阅下面的代码和控制台输出。
主视图控制器
class MainViewController: UIViewController, UserChosePhoto {
@IBOutlet weak var googleImageView: UIImageView!
var usedImage: UIImage? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
googleImageView.image = usedImage
println("viewDidLoad: \(googleImageView)")
}
func userHasChosen(image: UIImage) {
usedImage = image
println("imageView: \(googleImageView)")
println("delegation: \(image)")
}
}
DetailViewController
protocol UserChosePhoto {
func userHasChosen(image: UIImage)
}
class GoogleDetailViewController: UIViewController {
@IBOutlet weak var bigImageView: UIImageView!
var image: UIImage? = nil
var delegate: UserChosePhoto? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
bigImageView.image = image
let barButtonItem = UIBarButtonItem(title: "Use", style: UIBarButtonItemStyle.Plain, target: self, action: "tapped")
self.navigationItem.rightBarButtonItem = barButtonItem
self.delegate = MainViewController()
}
func tapped() {
if (delegate != nil) {
self.delegate!.userHasChosen(bigImageView.image!)
}
self.dismissViewControllerAnimated(true, completion: nil)
}
}
控制台输出:第一个 viewDidLoad 日志来自应用程序启动。找到 10 张图片 - 来自 API 通话的日志。 imageView - 这是有问题的 imageView。委托:这里我有一个 UIImage
viewDidLoad: <UIImageView: 0x7f94825cabf0; frame = (180 159; 240 282); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7f94825caeb0>> - (null)
found 10 pictures
imageView: nil
delegation: <UIImage: 0x7f94848344a0>, {213, 290}
任何提示都会很酷 - 我现在真的迷路了。
谢谢!
您实际上从未为图像视图设置 image
属性。您唯一一次这样做是在 viewDidLoad
中,此时它可能不存在并且您不会再这样做。设置它的操作是一次性的并且不绑定数据,所以你必须在更新 属性 时自己更新它。应该这样做:
func userHasChosen(image: UIImage) {
usedImage = image
googleImageView.image = usedImage
println("imageView: \(googleImageView)")
println("delegation: \(image)")
}
另一种方法(可以说更简洁)是为您的图像实施 didSet
挂钩 属性.
var usedImage: UIImage? = nil
{
didSet
{
googleImageView.image = usedImage
}
}
这可能是问题所在:
self.delegate = MainViewController()
在这里,您将 DetailViewController
的委托设置为 MainViewController
的 new 实例(因此有括号)。您需要将委托设置为其父级(也是 MainViewController
类型)
当您调用 self.dismissViewControllerAnimated(true, completion: nil)
时,您现在返回到原来的 MainViewController
,但从未在此视图控制器上调用函数 userHasChosen
,因此它崩溃了。
所以,基本上你需要做的是确保你的 DetailViewController
的 delegate
设置为其父级,你可以通过 myDetailViewController.parent
(有时这对我不起作用,但我现在不在 XCode 中进行测试)或者您可以将父级的引用传递给您的子视图控制器并将其设置为它的 delegate
.
编辑:我对您的代码和视图控制器的设置方式做了一些假设,这些假设可能并不完全准确。如果您的控制流确实是 MainVC -> CollectionView -> DetailVC,那么您可能无法直接获取它的 "parent"。相反,您必须执行我建议的第二部分,即仅将 MainVC 的引用传递给 DetailVC,然后您可以在 ViewController 中使用它,而不是创建新的 MainViewController
。
并且因为可能不清楚:当我提到 DetailViewController
的父级时,我指的是它来自的 MainViewController
,而不是 CollectionView(即使那里的按钮是什么带你到 DetailVC)
我没主意了,我不知道如何解决这个问题。任何帮助将不胜感激。
我遇到了以下情况:
- 指向嵌入在 NavController 中的 CollectionView 的 MainViewController
- CollectionView 指向一个 DetailViewController
- DetailViewController 显示在 CollectionView 中选择的完整图片,并有一个将此图像传递给 MainViewController 的按钮。协议和委托用于此
- 此图像现在应显示在 MainViewController 的 UIImageView 中
代表团工作。我的 MainViewController 中有一个 UIImage。但是:UIImageView 为零。因此,当我将所选图像设置为 imageView.image 时,它会崩溃。 MainViewController 已初始化,我还看到了我的默认图片。请参阅下面的代码和控制台输出。
主视图控制器
class MainViewController: UIViewController, UserChosePhoto {
@IBOutlet weak var googleImageView: UIImageView!
var usedImage: UIImage? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
googleImageView.image = usedImage
println("viewDidLoad: \(googleImageView)")
}
func userHasChosen(image: UIImage) {
usedImage = image
println("imageView: \(googleImageView)")
println("delegation: \(image)")
}
}
DetailViewController
protocol UserChosePhoto {
func userHasChosen(image: UIImage)
}
class GoogleDetailViewController: UIViewController {
@IBOutlet weak var bigImageView: UIImageView!
var image: UIImage? = nil
var delegate: UserChosePhoto? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
bigImageView.image = image
let barButtonItem = UIBarButtonItem(title: "Use", style: UIBarButtonItemStyle.Plain, target: self, action: "tapped")
self.navigationItem.rightBarButtonItem = barButtonItem
self.delegate = MainViewController()
}
func tapped() {
if (delegate != nil) {
self.delegate!.userHasChosen(bigImageView.image!)
}
self.dismissViewControllerAnimated(true, completion: nil)
}
}
控制台输出:第一个 viewDidLoad 日志来自应用程序启动。找到 10 张图片 - 来自 API 通话的日志。 imageView - 这是有问题的 imageView。委托:这里我有一个 UIImage
viewDidLoad: <UIImageView: 0x7f94825cabf0; frame = (180 159; 240 282); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7f94825caeb0>> - (null)
found 10 pictures
imageView: nil
delegation: <UIImage: 0x7f94848344a0>, {213, 290}
任何提示都会很酷 - 我现在真的迷路了。
谢谢!
您实际上从未为图像视图设置 image
属性。您唯一一次这样做是在 viewDidLoad
中,此时它可能不存在并且您不会再这样做。设置它的操作是一次性的并且不绑定数据,所以你必须在更新 属性 时自己更新它。应该这样做:
func userHasChosen(image: UIImage) {
usedImage = image
googleImageView.image = usedImage
println("imageView: \(googleImageView)")
println("delegation: \(image)")
}
另一种方法(可以说更简洁)是为您的图像实施 didSet
挂钩 属性.
var usedImage: UIImage? = nil
{
didSet
{
googleImageView.image = usedImage
}
}
这可能是问题所在:
self.delegate = MainViewController()
在这里,您将 DetailViewController
的委托设置为 MainViewController
的 new 实例(因此有括号)。您需要将委托设置为其父级(也是 MainViewController
类型)
当您调用 self.dismissViewControllerAnimated(true, completion: nil)
时,您现在返回到原来的 MainViewController
,但从未在此视图控制器上调用函数 userHasChosen
,因此它崩溃了。
所以,基本上你需要做的是确保你的 DetailViewController
的 delegate
设置为其父级,你可以通过 myDetailViewController.parent
(有时这对我不起作用,但我现在不在 XCode 中进行测试)或者您可以将父级的引用传递给您的子视图控制器并将其设置为它的 delegate
.
编辑:我对您的代码和视图控制器的设置方式做了一些假设,这些假设可能并不完全准确。如果您的控制流确实是 MainVC -> CollectionView -> DetailVC,那么您可能无法直接获取它的 "parent"。相反,您必须执行我建议的第二部分,即仅将 MainVC 的引用传递给 DetailVC,然后您可以在 ViewController 中使用它,而不是创建新的 MainViewController
。
并且因为可能不清楚:当我提到 DetailViewController
的父级时,我指的是它来自的 MainViewController
,而不是 CollectionView(即使那里的按钮是什么带你到 DetailVC)