2017-07-02 81 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的数组。