2015-10-29 2 views
0

У меня есть класс, где я вызываю UIImagePickerController, чтобы выбрать изображение и вернуть его, чтобы я мог использовать его где-то еще в моем коде.UIImagePickerControllerDelegate функции не называются

Теперь я устанавливаю делегат и реализую необходимую мне необходимую функцию, но функции делегата не вызываются.

Часть моего кода, который имеет вопрос:

import UIKit 

typealias PhotoTakingHelperCallback = (UIImage? -> Void) 

class PhotoTakingHelper: NSObject 
{ 

    weak var viewController:UIViewController! 
    var callback: PhotoTakingHelperCallback 
    var imagePickerController: UIImagePickerController? 

    init(viewController:UIViewController , callback:PhotoTakingHelperCallback) { 

     self.viewController = viewController 

     self.callback = callback 
     super.init() 
     showPhotoSourceSelection() 
    } 


    func showPhotoSourceSelection() { 
     let alertController = UIAlertController(title: nil, message: "Where do you want to get your picture from?", preferredStyle: .ActionSheet) 

     let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 

     alertController.addAction(cancelAction) 

     let photoLibraryAction = UIAlertAction(title: "Photo from Library", style: .Default) { (action) -> Void in 
      self.showImagePickerController(.PhotoLibrary) 
     } 

     alertController.addAction(photoLibraryAction) 

     if (UIImagePickerController.isCameraDeviceAvailable(.Rear)) { 
      let cameraAction = UIAlertAction(title: "Photo from Camera", style: .Default, handler: { (action) -> Void in 
       self.showImagePickerController(.Camera) 
      }) 

      alertController.addAction(cameraAction) 
     } 

     viewController.presentViewController(alertController, animated: true, completion: nil) 

    } 

    func showImagePickerController(sourceType: UIImagePickerControllerSourceType) { 
     imagePickerController = UIImagePickerController() 
     imagePickerController!.delegate = self 
     imagePickerController!.sourceType = sourceType 

     print("Set the delegate \(imagePickerController?.delegate?.isMemberOfClass(PhotoTakingHelper))") 

     self.viewController.presentViewController(imagePickerController!, animated: true, completion: nil) 
    } 

} 


extension PhotoTakingHelper: UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     print("HELLO?") 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) { 

     viewController.dismissViewControllerAnimated(false, completion: nil) 
     print("calling the callback now ") 

     callback(image) 

     print("Finished calling the callback") 
    } 


} 

Я проверил iPhone: UIImagePickerControllerDelegate methods not Invoked? и a similar problem и многое другое, но никто из них не решен вопрос.

Я понял, что ни один из методов делегата не вызывается, когда я запускаю программу на симуляторе и выбираю изображение в библиотеке фотографий, только консоль печатает.

Установите делегат Опционно (правда)

+0

Я думаю, что ваш imagePickerController отпущен до вызова метода делегата ... просто попытаться сделать его глобальным. ..Я имею в виду объявить как свойство –

+0

да, но я не имею его в образце кода, плохо добавьте его сейчас, чтобы предотвратить путаницу – stringRay2014

ответ

7

Вы создаете PhotoTakingHelper, но вы не держите ссылку на него. То есть, вы делаете что-то вроде этого:

// In your view controller 

@IBAction func pickImageButtonWasTapped() { 
    _ = PhotoTakingHelper(viewController: self) { image in 
     print("Callback!") 
    } 
} 

UIImagePickerController сохраняет только слабую ссылку на его делегатом, который не достаточно, чтобы держать его в живых, так что вы должны держать сильную ссылку на него. Вы можете сделать это путем сохранения помощника в переменной экземпляра контроллера вида, например:

// In your view controller 

var helper: PhotoTakingHelper? 

@IBAction func pickImageButtonWasTapped() { 
    helper = PhotoTakingHelper(viewController: self) { image in 
     print("Callback!") 
    } 
} 

Или вы могли бы сделать помощник сохранить ссылку на себя, как это:

// In PhotoTakingHelper 

var me: PhotoTakingHelper? 

init(viewController:UIViewController , callback:PhotoTakingHelperCallback) { 
    self.viewController = viewController 
    self.callback = callback 
    super.init() 
    me = self 
    showPhotoSourceSelection() 
} 

И то вам необходимо установить ссылку на ноль, когда сборщик изображения сделано, чтобы помощник освобождаться:

extension PhotoTakingHelper: UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     viewController.dismissViewControllerAnimated(false, completion: nil) 
     callback(info[UIImagePickerControllerOriginalImage] as? UIImage) 
     me = nil 
    } 

    func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
     viewController.dismissViewControllerAnimated(false, completion: nil) 
     me = nil 
    } 

} 
+0

Hey @rob, еще не проверил код, но мне было интересно, можете ли вы отправить мне какие-либо ссылки, которые далее объясняет, почему у делегата есть слабая ссылка и все сильные/слабые ссылки, потому что я считаю это действительно запутанным! СПАСИБО !! – stringRay2014

+0

[Основные компетенции какао: владение объектами] (https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/ObjectOwnership.html#//apple_ref/doc/uid/TP40008195-CH67- SW1). - [Почему делегатам Objective-C обычно присваивается присваивание свойства вместо сохранения?] (Http://stackoverflow.com/q/918698/77567) –

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