我没有想法,我也不知道如何解决这个问题。任何帮助将不胜感激。

我有以下情况:

  • MainViewController,指向嵌入在NavController中的CollectionView
  • CollectionView指向一个DetailViewController
  • DetailViewController显示在CollectionView中选择的完整图片,并具有将该图像传递到MainViewController的按钮。协议和委托用于此
  • 现在应该在MainViewController的UIImageView中显示该图像

  • 代表团在工作。我的MainViewController中有一个UIImage。但是:UIImageView为零。因此,当我将选定的Image设置为imageView.image时,它崩溃了。 MainViewController已初始化,我还看到了我的默认图片。参见下面的代码和控制台输出。

    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-log来自应用程序启动。找到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}
    

    任何提示都很酷-我现在真的迷路了。

    谢谢!

    最佳答案

    这可能是问题所在:
    self.delegate = MainViewController()
    在这里,您将DetailViewController的委托设置为MainViewController的新实例(因此带有括号)。您需要将委托设置为其父代(也为MainViewController类型)

    现在,当您调用self.dismissViewControllerAnimated(true, completion: nil)时,您将返回到原始MainViewController,但是从未在此View Controller上调用过userHasChosen函数,因此它崩溃了。

    因此,从本质上讲,您需要做的是确保将delegateDetailViewController设置为其父代,您可以通过执行myDetailViewController.parent来获得(有时这对我不起作用,但我不在XCode中进行测试),也可以将父对象的引用传递给子视图控制器,并将其设置为其delegate

    编辑:我对您的代码和视图控制器的设置方式做了一些假设,可能并不完全准确。如果您的控制流确实进入MainVC-> CollectionView-> DetailVC,那么您可能无法仅获得其“父级”。相反,您将不得不执行我的建议的第二部分,即仅将MainVC的引用传递给DetailVC,然后可以在该ViewController中使用它,而不必创建新的MainViewController

    并且因为可能不清楚:当我指的是DetailViewController的父代时,我的意思是它来自的MainViewController,而不是CollectionView(即使从那里进入的按钮是带您进入DetailVC的)

    关于ios - Swift-通过委托(delegate)将UIImage传递给UIImageView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30873889/

    10-11 19:45