2017-12-16 13 views
0

기기 흔들기에서 임의의 노래를 재생하는 앱을 개발 중입니다. 다음은 내가 음악 폴더에 내 mp3 파일을 배치 한 내 코드흔들어서 내 배열 목록에서 임의의 노래를 재생할 때 예외가 발생했습니다.

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 
    var player = AVAudioPlayer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) { 
     if event?.subtype == UIEventSubtype.motionShake{ 
      let soundArray=["firstsong","second","fourth"] 
      let randomNumber=Int(arc4random_uniform(UInt32(Int32(soundArray.count)))) 

      let fileLocation = Bundle.main.path(forResource: soundArray[randomNumber], ofType: "mp3") 
      do { 
       try player=AVAudioPlayer(contentsOf:URL(fileURLWithPath:fileLocation!)) 
       player.play() 
      }catch{ 

      } 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

입니다. 내가 장치를 흔들 때 은 내가 어떤 도움이 크게 될

+0

자, 코드를 디버깅해야합니다. 지역 변수로 작은 단계로 나누고 함수의 맨 위에 중단 점을 설정 한 다음 단계별로 각 행의 결과를 검토하십시오. 내 돈은'fileLocation! '이라는 표현입니다. fileLocation이 nil이면 충돌합니다. (force-unwrap 연산자를 "nil if crash"연산자라고 부르겠습니다. 실제로 무엇을하는지 알 때까지는이를 피하십시오.) –

답변

0

기다립니다 감사 할

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value 

다음과 같은 오류를 얻을. 파일을 음악 폴더에 넣었다고하셨습니까? 코드가 잘못되었습니다. 게시 한 코드가 앱 번들 내에서 파일을 읽으려고합니다. 사용자의 음악 폴더에서 파일을 읽으려면 완전히 다른 접근 방식을 사용해야하며 파일이 있는지 확인하고 그렇지 않은 경우 정상적으로 실패하는지 확인해야합니다.

사운드 파일을 프로젝트의 "resources"폴더로 Xcode로 드래그하고 파일 체크 박스가 선택되어 앱 번들에 포함되도록하는 것이 좋습니다. 만약 당신이 코드를 작동해야합니다 (하지만 위의 내 코멘트에서 언급 한 것처럼 강제로 unwrapping을 사용하는 대신 nil을 확인해야합니다.)

+0

'url (forResource : withExtension :)'대신' 경로 (forResource : ofType :)'. 애플은 경로 문자열 사용을 멀리하고 있으며 URL 기반 메소드는 새로운 개발에 우선적으로 사용됩니다. (Mac OS에서는 URL 기반 메서드를 사용하여 샌드 박스가 올바르게 작동해야합니다.) –