2017-01-04 3 views
0

내가 클래스didFinishPickingImage는

class ActivitiesMainPageController: UICollectionViewController  ,UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    switch indexPath.item { 

    case 0 : 
     let takePictureInstance = takePictures() 
     takePictureInstance.presentCamera() 
    } 

} 

takePictures을() s의 사용자 정의 클래스

class takePictures: UIViewController, UIImagePickerControllerDelegate, UIAlertViewDelegate, UINavigationControllerDelegate 
{ 
    var imagePicker: UIImagePickerController! = UIImagePickerController() 
    func presentCamera() 
    { 

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) 
    { 

     let objViewController = UIApplication.shared.keyWindow?.rootViewController 

     imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 
     imagePicker.allowsEditing = false 
     imagePicker.sourceType = UIImagePickerControllerSourceType.camera 
     objViewController?.present(imagePicker,animated: true,completion: nil) 
    } 
    else 
    { 
     // error msg 
     print ("error displaying Camera") 
     noCamera() 
    } 
} 



    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 

    print(self.Tag + "image picker controller") 

    self.dismiss(animated: true, completion: nil) 
    } 
} 

didfinishpickingimage 트리거 결코 극복이 트리거되지 않습니다. 나는 print 진술을 보지 못했다. SO를 읽은 후 ere, 나는 델리게이트를 제대로하지 않을 것이라고 생각합니다. 좀 도와 줄 수있어?

+0

방법은 사용되지 않습니다. 그래서 전화를받지 않은 것입니다. '선택적인 func imagePickerController (_ picker : UIImagePickerController, didFinishPickingMediaWithInfo info : [String : Any])'를 대신 사용할 수 있습니까? – Larme

+0

메소드를 didFinishPickingMediaWithInfo로 변경했습니다. 아직도 fuction은 방아쇠를 당하지 않는다. –

답변

1

문제는 ActivitiesMainPageController 클래스에 있습니다. 그것은 메모리 관리 문제입니다. takePictures 클래스의 로컬 인스턴스를 만들고 (FYI 클래스 이름은 대문자로 시작해야 함) presentCamera 메서드를 호출합니다. 그리고 나서 takePictureInstance 변수는 즉시 범위를 벗어납니다. 즉, 더 이상 참조가없고 할당이 해제됩니다.

그래서이 시점에서 이미지 선택자 (약한) 대리자는 nil이됩니다. 이것이 이미지 선택기 대리자 메서드가 호출되지 않는 이유입니다.

  1. ActivitiesMainPageController 클래스 내부의 takePictures 인스턴스에 대한 강한 참조를 유지 (지역 변수 대신 속성을 사용) :

    는이 문제를 해결하는 두 가지 방법이 있습니다. 그러나 인스턴스를 해제해야하는 시점을 알지 못하는 문제가 있습니다.

  2. takePictures 클래스 내에서 약간의 트릭을 수행하여 이미지를 만들 때 강력한 참조를 유지 한 다음 이미지 선택기를 닫은 후 강력한 참조를 해제합니다.

옵션 2는 다음과 같이 구현할 수 있습니다

class takePictures: UIViewController, UIImagePickerControllerDelegate, UIAlertViewDelegate, UINavigationControllerDelegate 
{ 
    var strongSelf: takePictures? 
    var imagePicker: UIImagePickerController! = UIImagePickerController() 

    func presentCamera() 
    { 
     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) 
     { 
      let objViewController = UIApplication.shared.keyWindow?.rootViewController 

      imagePicker = UIImagePickerController() 
      imagePicker.delegate = self 
      imagePicker.allowsEditing = false 
      imagePicker.sourceType = UIImagePickerControllerSourceType.camera 
      objViewController?.present(imagePicker,animated: true,completion: nil) 
      strongSelf = self // keep me around 
     } 
     else 
     { 
      // error msg 
      print ("error displaying Camera") 
      noCamera() 
     } 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 
     print(self.Tag + "image picker controller") 

     self.dismiss(animated: true, completion: nil) 
     strongSelf = nil // let me go 
    } 
} 
1

takePictures 클래스의 UIImagePicker를 제시하는 이유 (TakePictures이어야 함)? 나는 당신이 현재있는 뷰 컨트롤러가 피커를 제시하는 컨트롤러가 아니기 때문에 문제가 발생했다고 생각합니다. 당신이 presentCamera() 기능을 꺼내와 ActivitiesMainPageController에 넣어 <를 할당하는 경우 - 대리인으로도 올바른 하나에 방법 서명을 전환하는 것이 :

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 

당신은 더 나은 운이 있어야합니다.