2017-01-15 7 views
0

UIImagePickerControllerを試して、ライブラリから写真を選択するか、カメラで写真を撮ることができます。UIImagePickerController throw SIGABRT

私はウェブサイト(https://makeapppie.com/2016/06/28/how-to-use-uiimagepickercontroller-for-a-camera-and-photo-library-in-swift-3-0/)の手順に従い、写真ライブラリでこれを動作させましたが、私のアプリからカメラを呼び出すときはいつでも、「スレッド1:信号SIGABRT」というエラーが表示されます。

これは私がカメラを起動するために使用していたコードです:

picker.allowsEditing = false 
picker.sourceType = UIImagePickerControllerSourceType.camera 
picker.cameraCaptureMode = .photo 
picker.modalPresentationStyle = .fullScreen 
present(picker,animated: true,completion: nil) 

SIGABRTエラーがシミュレータ内で予想されるであろうというのが私の理解でした。しかし、iPhone 7で試したところ、うまくいくと思っていましたが、同じエラーが発生しました。 Info.plistファイルへ - 「カメラの使用説明プライバシー」

私が追加されました。

私が間違ってやっている任意のアイデア?

答えて

2

はここ

// MARK: Camera App 

func openCameraApp() { 
    if UIImagePickerController.availableCaptureModes(for: .rear) != nil { 
     picker.allowsEditing = false 
     picker.sourceType = UIImagePickerControllerSourceType.camera 
     picker.cameraCaptureMode = .photo 
     picker.modalPresentationStyle = .fullScreen 
     present(picker, 
       animated: true, 
       completion: nil) 
    } else { 
     noCamera() 
    } 
} 
func noCamera(){ 
    let alertVC = UIAlertController(
     title: "No Camera", 
     message: "Sorry, this device has no camera", 
     preferredStyle: .alert) 
    let okAction = UIAlertAction(
     title: "OK", 
     style:.default, 
     handler: nil) 
    alertVC.addAction(okAction) 
    present(
     alertVC, 
     animated: true, 
     completion: nil) 
} 

// MARK: Photos Albums 

func showImagePicker() { 
    picker.allowsEditing = false 
    picker.sourceType = .photoLibrary 
    //picker.modalPresentationStyle = .Popover 
    present(picker, 
      animated: true, 
      completion: nil) 
    picker.popoverPresentationController?.sourceView = self.view 
} 
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
    image = chosenImage 
    self.performSegue(withIdentifier: "ShowEditView", sender: self) 
    dismiss(animated: true, completion: nil) 
} 
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    dismiss(animated: false, completion: nil) 
} 

// MARK: Seque to EditViewController 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ShowEditView" { 
     if let vc = segue.destination as? EditViewController { 
      vc.image = image 
      //vc.image = images[0] 
     } 
    } 
} 

を選択/使用するための私の完全なコードは、2つのコメントアウト行を無視しています - これらは、物事をテストするための鉱山です。このコードはiOS 9以降のすべてのデバイスで動作しますが、iPhoneは常にポートレートで表示されますので、シミュレータ(カメラはありません)でも物理デバイスでも問題は一度もありません。

問題が発生する可能性のあるものがある(SIGABRTを投げているかどうかわからない) - 後部カメラをチェックし、存在しなければ警告を発する。 (フロントカメラのチェックはしていませんが、iPod touch以外にフロントカメラがないかどうか分かりません)

また、info.plistに2つのものを追加することを忘れないでください。 iOS 10:

<key>NSCameraUsageDescription</key> 
<string>Used to capture new image for photo effect</string> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>Used to select an image for photo effect</string> 

説明タグに任意の文字を入力できます。これらがなければ、アプリはiOS 10でシャットダウンされ、Appleはあなたの提出を拒否します。 Here's詳細へのリンク。

+0

答えをありがとう。申し訳ありませんが、私の元の質問は少し曖昧でした。私はシミュレータでエラーが発生すると思っていましたが、私のiPhoneではエラーではありません。私は両方で同じエラーが発生しています。 –

+0

私は完全なコードで自分の答えを編集します。それが役に立たなかったら、私に知らせて、私はそれを削除します。ありがとう。 – dfd

+0

@AlanSpark - 問題は@dfdのように 'info.plist'ファイルを更新するだけで解決します。より簡単な方法が必要な場合は、キーをコピー&ペーストしてから、 'info.plist'ファイルに新しい行を挿入するときに値の列に値を手動で入力してください。たとえば、新しい行を作成し、「Key」列に 'NSCameraUsageDescription'を貼り付けます。その後、ちょうど私が私が今述べたことは、実際に「より簡単に」ではないと思いますが、それは「上がらない人々にとってより便利だ「値」欄 – Pierce