2017-07-02 145 views
0

我改變我的2列...如何搜索結構(SWIFT)

var title = ["Title 1", "Title 2", "Title 3"] 
var artist = ["Artist 1", "Artist 2", "Artist 3"] 

...一個struct

struct Song { 
    var title: String 
    var artist: String 
} 

var songs: [Song] = [ 
    Song(title: "Title 1", artist "Artist 1"), 
    Song(title: "Title 2", artist "Artist 2"), 
    Song(title: "Title 3", artist "Artist 3"), 
] 

設置我UITableView,這樣的標題單元格等於songs[indexPath.row].title,並且單元格的字幕等於songs[indexPath.row].artist。我想用UISearchBar來搜索UITableView。每當我只有變量而不是結構時,它運行良好。但是,現在我對

var filteredTitles:[String] = [] 
var searchActive : Bool = false 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    filteredTitles = title.filter //the error ({ (text) -> Bool in 
     let tmp: NSString = text as NSString 
     let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive) 
     return range.location != NSNotFound 
    }) 
     if(filteredTitles.count == 0){ 
     searchActive = false; 
    } else { 
     searchActive = true; 
    } 
    self.myTableView.reloadData() 
} 

發現錯誤正如你所看到的,就行了filteredTitles = title.filter它調用我的老變量,title。我應該怎樣替換這一行,以便它搜索結構的標題?

感謝您的幫助!

回答

0

你需要改變你的filteredTitles是的Song數組(和其重命名爲filteredSongs

接着,電話更新爲filter,從而text被替換song和您訪問的songtitle財產。

而且也沒有必要投下的標題NSString

這裏與所需的更改代碼:

var filteredSongs = [Song]() 
var searchActive = false 

func searchBar(searchText: String) { 
    filteredSongs = songs.filter { (song) -> Bool in 
     return song.title.range(of: searchText, options: [ .caseInsensitive ]) != nil 
    } 

    searchActive = !filteredSongs.isEmpty 

    self.myTableView.reloadData() 
} 

這個假設songs是你的歌曲數組。

請注意,還有很多其他的清理工作。

而且您可能需要更新您的表視圖數據源方法來處理filteredSongs,該數組是Song而不是String的數組。