2015-08-23 4 views
1

В this Быстрый учебник, предоставляемый яблоком, имеет пример, чтобы выбрать изображение из библиотеки фотографий. Код выглядит следующим образом:Зачем использовать UIImagePickerController?

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
  1. Проще говоря, протокол UIImagePickerControllerDelegate для реагирования на вещи, которые происходят в палитре изображения. UIImagePickerController также требует, чтобы его delegate соответствовал UINavigationControllerDelegate, поскольку выборщик изображений - a (подкласс) навигационного контроллера. Однако эти методы являются необязательными.

  2. Это не помешает, но просто нет необходимости сохранять ссылку на подборщик изображений в переменной экземпляра. Сам сборщик передается в качестве первого параметра для методов делегата. Он будет автоматически сохранен, пока он не исчезнет.

  3. Ожидается, что вы обработаете метод DidCancel и отпустите контроллер, потому что в противном случае средство выбора изображений останется на экране!

    Редактировать: Хотя кажется, что в настоящее время UIImagePickerController автоматически отклоняется, если вы не реализуете метод делегата.

    Чтобы проверить это, я просто отменяют dismissViewControllerAnimated добавить контрольную точку:

    breakpoint

    Затем вы можете увидеть следующую трассировку стека при нажатии на кнопку Отмена:

+0

Я протестировал программу, не выполнив DidCancel, и он отклонил выборщик изображений. Вот почему мне интересно. – stk

+0

Я вижу. Я думаю, UIImagePickerController пытается быть приятным, поэтому вам не нужно делать дополнительную работу :) – jtbandes

+0

В первом вопросе, который я задал, когда мне не нужен делегат навигации, если класс соответствует делегату сборщика. Если это всегда необходимо, разве он не делает код уродливым и подверженным ошибкам? – stk

Смежные вопросы