現(xiàn)在我們將添加最后一個(gè)功能:允許用戶刪除專輯,以及撤銷上次的刪除操作。
在 ViewController
里添加如下屬性:
// 為了實(shí)現(xiàn)撤銷功能,我們用數(shù)組作為一個(gè)棧來 push 和 pop 用戶的操作
var undoStack: [(Album, Int)] = []
然后在 viewDidLoad
的 reloadScroller()
后面添加如下代碼:
let undoButton = UIBarButtonItem(barButtonSystemItem: .Undo, target: self, action:"undoAction")
undoButton.enabled = false;
let space = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target:nil, action:nil)
let trashButton = UIBarButtonItem(barButtonSystemItem: .Trash, target:self, action:"deleteAlbum")
let toolbarButtonItems = [undoButton, space, trashButton]
toolbar.setItems(toolbarButtonItems, animated: true)
上面的代碼創(chuàng)建了一個(gè) toolbar
,上面有兩個(gè)按鈕,在 undoStack
為空的情況下, undo
的按鈕是不可用的。注意 toolbar
已經(jīng)在 storyboard
里了,我們需要做的只是配置上面的按鈕。
我們需要在 ViewController.swift
里添加三個(gè)方法,用來處理專輯的編輯事件:增加,刪除,撤銷。
先寫添加的方法:
func addAlbumAtIndex(album: Album,index: Int) {
LibraryAPI.sharedInstance.addAlbum(album, index: index)
currentAlbumIndex = index
reloadScroller()
}
做了三件事:添加專輯,設(shè)為當(dāng)前的索引,重新加載滾動(dòng)條。
接下來是刪除方法:
func deleteAlbum() {
//1
var deletedAlbum : Album = allAlbums[currentAlbumIndex]
//2
var undoAction = (deletedAlbum, currentAlbumIndex)
undoStack.insert(undoAction, atIndex: 0)
//3
LibraryAPI.sharedInstance.deleteAlbum(currentAlbumIndex)
reloadScroller()
//4
let barButtonItems = toolbar.items as [UIBarButtonItem]
var undoButton : UIBarButtonItem = barButtonItems[0]
undoButton.enabled = true
//5
if (allAlbums.count == 0) {
var trashButton : UIBarButtonItem = barButtonItems[2]
trashButton.enabled = false
}
}
挨個(gè)看一下各個(gè)部分:
undoAction
對(duì)象,用元組存儲(chǔ) Album
對(duì)象和它的索引值。然后把這個(gè)元組加到了棧里。LibraryAPI
刪除專輯數(shù)據(jù),然后重新加載滾動(dòng)條。最后添加撤銷按鈕:
func undoAction() {
let barButtonItems = toolbar.items as [UIBarButtonItem]
//1
if undoStack.count > 0 {
let (deletedAlbum, index) = undoStack.removeAtIndex(0)
addAlbumAtIndex(deletedAlbum, index: index)
}
//2
if undoStack.count == 0 {
var undoButton : UIBarButtonItem = barButtonItems[0]
undoButton.enabled = false
}
//3
let trashButton : UIBarButtonItem = barButtonItems[2]
trashButton.enabled = true
}
照著備注的三個(gè)步驟再看一下撤銷方法里的代碼:
pop
出一個(gè)對(duì)象,這個(gè)對(duì)象就是我們當(dāng)初塞進(jìn)去的元祖,存有刪除的 Album
對(duì)象和它的索引位置。然后我們把取出來的對(duì)象放回了數(shù)據(jù)源里。enabled
。這時(shí)再運(yùn)行應(yīng)用,試試刪除和插銷功能,似乎一切正常了:
我們也可以趁機(jī)測(cè)試一下,看看是否及時(shí)存儲(chǔ)了專輯數(shù)據(jù)的變化。比如刪除一個(gè)專輯,然后切到后臺(tái),強(qiáng)關(guān)應(yīng)用,再重新開啟,看看是不是刪除操作成功保存了。
如果想要恢復(fù)所有數(shù)據(jù),刪除應(yīng)用然后重新安裝即可。
更多建議: