2016-03-30 19 views
2

エラーはありませんが、アプリケーションを実行するとクラッシュします。 ログは "キャッチされていない例外 'NSInvalidArgumentException'のためアプリを終了しています、理由: ' - [MPConcreteMediaItem imageWithSize:]:インスタンス0x14eefa3b0'に送信されたセレクタが認識されません。「認識できないセレクタをインスタンスに送信」Swift

私はこの問題が発生する行はこの1つだと思う:

cell?.imageView?.image = sortedResults[indexPath.row].imageWithSize(imageSize)

私はそれが/それをコメント解除し、削除する場合、すべてが正常に動作しますので。

imageSizeはCGSizeです。

全体コード:

let startTime: NSTimeInterval = NSDate().timeIntervalSince1970 
    let songsQuery: MPMediaQuery = MPMediaQuery.songsQuery() 
    let songsArray: [MPMediaItem] = songsQuery.items! 
    let songsNSArray : NSArray = NSArray(array: songsArray) 

    let descriptor: NSSortDescriptor = NSSortDescriptor(key: MPMediaItemPropertyLastPlayedDate, ascending: false) 
    let sortedResults: NSArray = songsNSArray.sortedArrayUsingDescriptors([descriptor]) 


    let finishTime: NSTimeInterval = NSDate().timeIntervalSince1970 
    NSLog("Execution took %f seconds to return %i results.", finishTime - startTime, sortedResults.count) 




    cell?.textLabel?.text = sortedResults[indexPath.row].title 
    cell?.detailTextLabel?.text = sortedResults[indexPath.row].artist 
    cell?.imageView?.image = sortedResults[indexPath.row].imageWithSize(imageSize) 
+0

エラーメッセージ全体を表示できますか? – Larme

+0

完全なエラーを投稿すると、あなたの質問に答える重要な部分が欠落しています。しかし、 'sortedResults [indexPath.row]'から返されるオブジェクトには 'imageWithSize(imageSize:CGSize)'メソッドが実装されていない可能性があります。 – Tim

+0

更新された質問を確認してください –

答えて

2

あなたはないが、あなたのsortedResultsNSArrayにオブジェクトを追加しましたあなたが期待しているタイプ。したがって、そのオブジェクトにimageWithSize(imageSize: CGSize)を呼び出すと、オブジェクトがそのセレクタに応答しないため、アプリケーションがクラッシュします(そのメソッドを実装します)。

MPMediaItemは、この方法を実装していません。 MPMediaItemの定数値にアクセスしたいと思われますか?

General Media Item Property

このような何か役立つことがあります。

if let mediaItem: MPMediaItem = sortedResults[indexPath.row] as? MPMediaItem { 
    cell?.textLabel?.text = mediaItem.valueForProperty(MPMediaItemPropertyAlbumTitle) as? String 
    cell?.detailTextLabel?.text = mediaItem.valueForProperty(MPMediaItemPropertyAlbumArtist) as? String 

    if let artwork: MPMediaItemArtwork = mediaItem.valueForProperty(MPMediaItemPropertyArtwork) as? MPMediaItemArtwork { 
     cell?.imageView?.image = artwork.imageWithSize(imageSize) 
    } 
} 

を長期的、私はスウィフトアレイ上の並べ替えの方法のいずれかを実装するのではなく、ハード使用してソートするにNSArrayに変換するお勧めします記述子 - このバグはコンパイル時に捕捉されていました。チェックしていないが、スウィフトに物を保管するためのこのようなもの:

songsArray.sort { (itemOne, itemTwo) -> Bool in 
    return itemOne.lastPlayedDate?.laterDate(itemTwo.lastPlayedDate!) == itemOne.lastPlayedDate 
} 
+0

さて、問題の内容を理解していると思います。しかし、どうすれば 'MPMediaItemPropertyArtwork'を正しく使うことができますか? NSArrayは '.valueforproperty'型のメンバを持っていません –

+0

配列の.valueForPropertyを呼び出すべきではありません。'let let mediaItem:MPMediaItem = sortedResults [indexPath.row] as?を使用して、配列からMPMediaItemを抽出する必要があります。 MPMediaItem' – Tim

+0

よかった、ありがとう!将来の視聴者にあなたの答えを完璧にするために、私はそれを編集することを提案します。文字列 'の末尾に' textLabel'と 'detailTextLabel'を追加しました –

3

私はsortedResults [indexPath.row]にあるオブジェクトを推測しているが、あなたはそれがあると思うし、それゆえ、それは方法imageWithSize()を持っていないものではありません。オブジェクトはnilかもしれませんか?安全のために

EDIT

、あなたは配列内のオブジェクトを使用する前に、このような何かを行うことができます:

if let validObject = sortedResults[indexPath.row] as MPConcreteMediaItem? { 
    // Can now use validObject safely, since we have checked that it is in fact an instance of MPConcreteMediaItem 
} 
関連する問題