Swift - 通过委托

时间:2015-06-16 17:07:03

标签: ios swift uiimageview uiimage protocols

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

我遇到以下情况:

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

代表团工作。我的MainViewController中有一个UIImage。但是:UIImageView是零。因此,当我将所选图像设置为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}

任何提示都会很酷 - 我现在真的输了。

谢谢!

2 个答案:

答案 0 :(得分:2)

这可能是个问题:

self.delegate = MainViewController()

您要将DetailViewController的委托设置为MainViewController实例(因此为括号)。您需要将委托设置为其父级(也是类型MainViewController

当您致电self.dismissViewControllerAnimated(true, completion: nil)时,您现在将回到原来的MainViewController,但此视图控制器上从未调用过函数userHasChosen,因此崩溃了。

因此,基本上您需要做的是确保delegate的{​​{1}}设置为其父级,您可以通过DetailViewController来获取该级别{这对我不起作用,但我现在不在XCode中进行测试)或者您可以将父级的引用传递给子视图控制器并将其设置为myDetailViewController.parent

编辑:我对你的代码和视图控制器的设置方式做了一些假设,这些假设可能并不完全准确。如果您的控制流确实进入MainVC - > CollectionView - &gt; DetailVC,那么你可能无法得到它的父母&#34;。相反,您必须完成我的建议的第二部分,即将您的MainVC的引用传递给您的DetailVC,然后您可以在该ViewController中使用它,而不是创建新的delegate

因为可能不清楚:当我提到MainViewController的父母时,我的意思是它所来自的DetailViewController,而不是CollectionView(即使是来自有什么把你带到了DetailVC)

答案 1 :(得分:0)

您实际上从未为图像视图设置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
    }
}