2015-02-10 55 views
0

即時編寫應用程序,但無法弄清楚如何將此特定的Objective-C行轉換爲swift。任何幫助都感激不盡。我已經能夠翻譯其他行很好,但這一個拋出一些異常錯誤。這是原始的Objective-C行:應用程序只顯示一個單元格(一首歌曲)而不是所有的單元格

MPMediaItem * rowItem = [songs objectAtIndex:indexPath.row];

我一個小白和已經嘗試了許多變化,包括:

變種rowItem = songs.objectAtIndex(indexPath.row)作爲MPMediaItem

var rowItem:MPMediaItem = songs.objectAtIndex(indexPath.row)as MPMediaItem

但我一直在這麼長時間,我看不到它應該是什麼。非常感謝!

編輯:

歌曲被定義爲:

讓songsQuery = MPMediaQuery.songsQuery()
讓歌曲= [songsQuery.items]如NSArray的

我剛接收一個exe_breakpoint錯誤。如果我使用...作爲[MPMediaItem]將MPMediaItem封裝在數組中,但我無法獲得屬性值,例如MPMediaItemPropertyTitle和MPMediaItemPropertyArtist。

更新: 通過使用for循環獲取MPMediaItemPropertyTitle和MPMediaPropertyArtist。 「歌曲」變量的定義如上所述。 @Antonio,刪除括號不起作用。這是我當前的代碼:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell 

    // Configure the cell... 

    let songsQuery = MPMediaQuery.songsQuery() 
    let allSongsArray = [songsQuery.items] as NSArray 

    var singleItem: AnyObject = allSongsArray[indexPath.row] 

    var rowItem = singleItem as [MPMediaItem] 

    if rowItem.count > 0 { 

     cell.textLabel?.text = rowItem[0].valueForProperty(MPMediaItemPropertyTitle) as NSString 
     cell.detailTextLabel?.text = rowItem[0].valueForProperty(MPMediaItemPropertyArtist) as NSString 
    } 

    return cell 
} 

的問題,我現在是當我測試的應用程序,它僅顯示非常的第一首歌曲在我的圖書館,並像它應該不會列出每首歌曲。感謝您提供任何幫助!

更新2:

得到它用下面的代碼工作:

class SongsViewController: UITableViewController { 

var allSongs : [MPMediaItem] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    allSongs += MPMediaQuery.songsQuery().items as [MPMediaItem] 
    println(allSongs.count) 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 

    return allSongs.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

    // Configure the cell... 

    var rowItem = allSongs[indexPath.row] 

    cell.textLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyTitle) as NSString 
    cell.detailTextLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as NSString 

    return cell 
} 
+0

你應該提供更多的細節 - 如何定義'songs'?你有什麼樣的錯誤?編譯或運行時?什麼是錯誤信息? – Antonio 2015-02-10 17:41:14

+0

@Antonio感謝您的回覆,我編輯了原帖。 – air6199 2015-02-10 17:46:59

+0

爲什麼那些方括號'[songsQuery.items]'? items屬性的數據類型是什麼? – Shoaib 2015-02-10 17:53:12

回答

0
var allSongs : [MPMediaItem] = [] 

override func viewDidLoad() { 
super.viewDidLoad() 

// Uncomment the following line to preserve selection between presentations 
// self.clearsSelectionOnViewWillAppear = false 

allSongs += MPMediaQuery.songsQuery().items as [MPMediaItem] 
println(allSongs.count) 

// Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
// self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 

    return allSongs.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

    // Configure the cell... 

var rowItem = allSongs[indexPath.row] 

cell.textLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyTitle) as NSString 
cell.detailTextLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as NSString 

return cell 

}

0
let allSongsArray = [songsQuery.items] as NSArray 

在這裏你採取Array<AnyObject>!而在另一個Array然後您可以轉換爲一個NSArray它包...相當混亂。

試試這個:

let songsQuery = MPMediaQuery.songsQuery() 
let allSongs = songsQuery.items as [MPMediaItem] 
let song = allSongs[indexPath.row] 

cell.textLabel?.text = song.valueForProperty(MPMediaItemPropertyTitle) as String 
cell.detailTextLabel?.text = song.valueForProperty(MPMediaItemPropertyArtist) as String 

而且,你真的應該緩存allSongs不是每則需要填充細胞時查詢它的。爲此,只需創建一個var allSongs: [MPMediaItem] = []到您的控制器。然後在例如viewDidLoad中使用MPMediaQuery來填充該數組。然後,您可以在任何表視圖委託和數據源方法中使用該數組。

+0

不,不起作用。 「數組索引超出範圍」的線讓歌曲:AnyObject = ...(我也假定allSongsArray應該是allSongs)我將如何緩存歌曲列表? – air6199 2015-02-10 18:41:34

+0

好吧,所以表中的行數可能與'allSongs'中的項數不同。你的numberOfRowsInSection ...方法做什麼? (你對'allSongsArray'是正確的,我修正了它) – Rengers 2015-02-10 18:43:13

+0

它執行一個songsQuery並將它們放入一個數組(與前兩行代碼發佈相同的方法),然後它返回allSongsArray.count – air6199 2015-02-10 18:47:06

0

我認爲你所做的錯誤是加載整個數據源cellForRowAtIndexPath,而這應該在另一個地方完成(viewDidLoad是一個很好的候選人),最重要的一次,而不是每一行。

我返工你的代碼,我想出了這個代碼:

class TestViewController : UITableViewController { 
    var allSongsArray: [MPMediaItem]! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let songsQuery = MPMediaQuery.songsQuery() 
     self.allSongsArray = songsQuery.items as [MPMediaItem] 

     // Other initializations 
     ... 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.allSongsArray.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell 

     var rowItem = self.allSongsArray[indexPath.row] 

     cell.textLabel?.text = rowItem[0].valueForProperty(MPMediaItemPropertyTitle) as NSString 
     cell.detailTextLabel?.text = rowItem[0].valueForProperty(MPMediaItemPropertyArtist) as NSString 

     return cell 
    } 
} 
+0

設法讓我的工作大約10秒鐘,然後再發布!我會在主帖中發佈相關代碼,請你看看我是否已經在正確的地方存儲/加載了數據? – air6199 2015-02-10 19:30:38

+0

@ air6199你的代碼看起來不錯,實際上我的看起來像你的複印件;-) – Antonio 2015-02-10 19:44:16

相關問題