2016-10-12 7 views
2

я модернизировал проект Swift 3 и я получаю аварии на линии (в различных точках/viewControllers в проекте):IOS Swift 3 UIImagePickerController аварии

present(picker, animated: true, completion: nil) 

в функции:

@IBAction func userImage(_ sender: AnyObject){ 
    print("button pressed") 
    let picker = UIImagePickerController() 
    picker.delegate = self 
    picker.allowsEditing = false 
    picker.sourceType = .photoLibrary 
    present(picker, animated: true, completion: nil) // -> crashes here 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
    self.imageToPost.setImage(newImage, for: UIControlState()) 
    self.imageToPost.imageView?.contentMode = UIViewContentMode.scaleAspectFill 
    picker.dismiss(animated: true, completion: nil) 
} 

сообщение аварии в консоли:

libsystem_kernel.dylib`__abort_with_payload: 
0x11108d138 <+0>: movl $0x2000209, %eax   ; imm = 0x2000209 
0x11108d13d <+5>: movq %rcx, %r10 
0x11108d140 <+8>: syscall 
-> 0x11108d142 <+10>: jae 0x11108d14c    ; <+20> 
0x11108d144 <+12>: movq %rax, %rdi 
0x11108d147 <+15>: jmp 0x111086d6f    ; cerror_nocancel 
0x11108d14c <+20>: retq 
0x11108d14d <+21>: nop  
0x11108d14e <+22>: nop  
0x11108d14f <+23>: nop  

в моем в info.plist у меня есть:

<key>NSPhotoLibraryUsageDescription</key> 
<string>$(PRODUCT_NAME) photo gallery use</string> 
<key>NSCameraUsageDescription</key> 
<string>$(PRODUCT_NAME) camera use </string> 
<key>NSMicrophoneUsageDescription</key> 
<string>$(PRODUCT_NAME) microphone use</string> 

Я огляделся и видел, что с NSPhotoLibraryUsageDescription и NSCameraUsageDescription в info.plist решает эту проблему (UIImagePickerController in Swift 3 и UIImagePickerController crashes app | Swift3, Xcode8), но это не для меня. Я сделал чистый и построить, перезапустить Xcode, перезапустить Mac и т.д.

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

objc[11204]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x11a0d8910) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x119f02210). One of the two will be used. Which one is undefined. 

, но в соответствии с этим потоком, который не имеет значения https://forums.developer.apple.com/thread/63254

мой класс имеет делегатов:

class PersonalSettingsVC: UIViewController, UITextFieldDelegate, UITextViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate 

Любая помощь очень ценится

+0

Set Two delegate => UIImagePickerControllerDelegate, UINavigationControllerDelegate –

+0

Привет, два делегата есть. Цените, что вы отвечаете. –

+0

@PeterdeVries, с которого в момент вашего краха приложения ... – seggy

ответ

0

Попробуйте мой код

Это с изображением с камерой или с библиотекой.

Просто дайте UIImagePickerControllerDelegate, UINavigationControllerDelegate

Установить свойство в файле Info.plist Неприкосновенность частной жизни - Photo Library Использование Описание: Разрешить фото

@IBAction func dsfsd(_ sender: AnyObject) { 

     let actionSheetController: UIAlertController = UIAlertController(title: "Action Sheet", message: "Swiftly Now! Choose an option!", preferredStyle: .actionSheet) 

     //Create and add the Cancel action 
     let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in 
      //Just dismiss the action sheet 
     } 
     actionSheetController.addAction(cancelAction) 
     //Create and add first option action 
     let takePictureAction: UIAlertAction = UIAlertAction(title: "Take Picture", style: .default) { action -> Void in 
      if( UIImagePickerController.isSourceTypeAvailable(.camera)) 

      { 
       let myPickerController = UIImagePickerController() 
       myPickerController.delegate = self 
       myPickerController.sourceType = .camera 
       self.present(myPickerController, animated: true, completion: nil) 
      } 
      else 
      { 
       let actionController: UIAlertController = UIAlertController(title: "Camera is not  available",message: "", preferredStyle: .alert) 
       let cancelAction: UIAlertAction = UIAlertAction(title: "OK", style: .cancel) { action -> Void  in 
        //Just dismiss the action sheet 
       } 

       actionController.addAction(cancelAction) 
       self.present(actionController, animated: true, completion: nil) 

      } 
     } 

     actionSheetController.addAction(takePictureAction) 
     //Create and add a second option action 
     let choosePictureAction: UIAlertAction = UIAlertAction(title: "Choose From Camera Roll", style: .default) { action -> Void in 
      let myPickerController = UIImagePickerController() 
      myPickerController.delegate = self; 
      myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary 
      self.present(myPickerController, animated: true, completion: nil) 
     } 
     actionSheetController.addAction(choosePictureAction) 

     //Present the AlertController 
     self.present(actionSheetController, animated: true, completion: nil) 

    } 


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


     let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
     self.imgview.image = image 

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

Я очень ценю ваш ответ и встретил ваш предыдущий ответ в другой угрозе. он сбой: «presentViewController (_: анимированный: завершение :)» был переименован в «present (_: анимированный: завершение :)» с помощью swift 3.0 –

+0

Хорошо, я проверю его –

+0

такой же сбой, но на «Выбрать из камеры» Рулон". Отличная реализация, хотя! –

0

Попробуйте это для Swift 3 ..

@IBAction func userImage(_ sender: AnyObject){ 
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) { 

      self.imagePicker.delegate = self 
      self.imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary; 
      self.imagePicker.allowsEditing = true 

      self.present(self.imagePicker, animated: true, completion: nil) 
      self.imagePicked.isUserInteractionEnabled = true 

     } 

} 
+0

Привет, попробовал это, с .camera ничего не делает (без камеры в симуляторе), когда я меняю ее на photoLibrary, тот же крах. –

+0

В настоящее время я использую этот код в своем приложении, а также поддерживаемый в ios 10, почему вы даете голос. Дайте вам какую-нибудь неправильную инструкцию? – seggy

+0

, так что вы знаете, я ценю всю вашу помощь и не голосую никого здесь –

0

try th для вашего быстрого 3.0 кода,

@IBAction func takePhoto(_ sender: UIButton) { 
    var picker = UIImagePickerController() 
    picker.delegate = self 
    picker.allowsEditing = true 
    picker.sourceType = .camera 
    self.present(picker, animated: true, completion: { _ in }) 
} 

@IBAction func selectPhoto(_ sender: UIButton) { 
    var picker = UIImagePickerController() 
    picker.delegate = self 
    picker.allowsEditing = true 
    picker.sourceType = .photoLibrary 
    self.present(picker, animated: true, completion: { _ in }) 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [AnyHashable: Any]) { 
    var chosenImage = info[UIImagePickerControllerEditedImage] 
    self.imageView!.image = chosenImage 
    picker.dismiss(animated: true, completion: { _ in }) 
} 

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    picker.dismiss(animated: true, completion: { _ in }) 
} 

Он представит сборщик в вашем приложении и будет работать идеально.

Надеюсь, что это решит вашу проблему.

+0

Это в swift 2.2 и его не работает в swift 3 –

+0

обновлено для swift 3.0. @Jecky – KAR

+0

Хорошо, теперь это прекрасная причина. Я также даю ответ в swift 2.2, поэтому я прокомментировал это. –

2

Хорошо, поэтому я понял. (3 дня моей жизни) Даже при том, что я помещал ключи конфиденциальности в свой info.plist, они не были фактически доступны/признаны приложением. поэтому мне нужно было перейти на приложение верхнего уровня -> Цели -> «MY_APP» -> info и поместить их туда. после этого он побежал. (Решения от Jecky, Seggy и KAR были великолепны, поэтому я поддержал). очевидно, ошибка, надеюсь, что это поможет кому-то.

+0

спасибо! отлично работает! –

1

для меня это сработало после того, как я добавил следующее в info.PLIST конфиденциальности - камеры Использование Описание $ (PRODUCT_NAME) камера использование

0

Попробуйте добавить NSCameraUsageDescription ключ к вашему PrettyApp-Info.plist файл с некоторым текстовым описанием.