为什么要像这样使用UIImagePickerController?

时间:2015-08-23 05:35:46

标签: ios swift

在Apple提供的this swift教程中,它有一个从照片库中选择图像的示例。代码如下所示:

class ViewController: UIImagePickerControllerDelegate, // Question 1
                      UINavigationControllerDelegate {
    ...

    @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) {
        nameTextField.resignFirstResponder()

        // Question 2
        let imagePickerController = UIImagePickerController()
        imagePickerController.sourceType = .PhotoLibrary
        imagePickerController.delegate = self

        presentViewController(imagePickerController, animated: true, completion: nil)
    }

    // Question 3
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        dismissViewControllerAnimated(true, completion: nil)
    }
}

我对此代码有三个问题:

  1. 我什么时候需要UIImagePickerControllerDelegate而不是UINavigationControllerDelegate,反之亦然?
  2. 为什么将imagePickerController创建为局部变量?在这种情况下,类实例变量是不好的设计吗?
  3. 我测试了imagePickerControllerDidCancel的默认行为,它确实关闭了视图控制器。然后我查了its document,其中说实现是可选的但是预期的。为什么会这样?

1 个答案:

答案 0 :(得分:1)

  1. 很简单,UIImagePickerControllerDelegate协议用于响应图像选择器中发生的事情。 UIImagePickerController 要求其$('.label a').each(function() { var $this=$(this); $this.closest('li').addClass($this.text()); }); // Combine This $('button').each(function(){ var liInd = 0; var cl = ''; var txt = ''; var clses = []; var ind = $('button').index($(this)) + 1; $('li').each(function(){ if(clses.indexOf($(this).attr('class')) === -1){ clses.push($(this).attr('class')); liInd = liInd + 1; } if(ind === liInd){ cl = $(this).attr('class'); txt = $(this).find('a').text(); return false; //break } }); $('button:nth-child(' + ind + ')').addClass(cl); $('button:nth-child(' + ind + ')').text(txt); }); 符合UINavigationControllerDelegate,因为图像选择器(导航控制器的子类)。但是,这些方法是可选的。

  2. 它不会受到伤害,但是不需要在实例变量中保存对图像选择器的引用。选择器本身作为委托方法的第一个参数传入。它会自动保留,直到它消失。

  3. 您需要处理delegate方法并关闭控制器,否则图像选择器将保留在屏幕上!

    编辑虽然现在看来,如果你没有实现委托方法,UIImagePickerController会自动解散。

    为了测试这个,我只是覆盖DidCancel来添加一个断点:

    breakpoint

    然后,当您单击“取消”按钮时,您可以看到以下堆栈跟踪: