2015-11-03 40 views
0

現狀實現搜索欄的功能 - 斯威夫特

我有一個從API我建立檢索數據的應用程序。檢索完數據後,它將數據填入UITableView。

內部我的HTTP請求我有以下的代碼,其中檢索到的數據保存到數組:

var dta = [] 

if let parseJSON = self.son { 

         self.dta = parseJSON 
        } 

之後我創建的檢索功能,如下所示:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    // if let id = dta["caseStudyTitle"] as? String 
    filtered = dta.filter({ (text) -> Bool in 

     //if let id = Summary["caseStudyTitle"] as? String 
     let tmp = text as! NSString 
     let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) 
     print("THIS IS TEXT \(text)") 
     return range.location != NSNotFound 

    }) 
    if(filtered.count == 0){ 
     searchActive = false; 
    } else { 
     searchActive = true; 
    } 
    self.tableView.reloadData() 
} 

的誤差

運行上面的代碼後,我得到以下錯誤:

Could not cast value of type '__NSCFDictionary' (0x10ef45c) to 'NSString' (0x460444). 

在該行:

let tmp = text as! NSString 

的數據結構

下面是JSON數據的結構中,DTA變量包含此數據。

[ 
    { 
    "_id":"qweqwqw", 
    "caseStudyTitle":"Title", 
    "caseStudyLink":"link", 
    "sector":"sec one", 
    "__v":0 
}, 
{ 
    "_id":"qweqwqw", 
    "caseStudyTitle":"Title", 
    "caseStudyLink":"link", 
    "sector":"sec one", 
    "__v":0 
}, 
{another object}, 
{another object} ] 

比賽結束

我希望能夠過濾被顯示在UITableView的數據。 如果用戶在搜索欄中鍵入內容,則UITableView會使用過濾的數據重新加載。

此外,我只需要搜索案例研究標題&部門領域。

如果您需要更多的信息才能解決此問題,請告訴我。

+0

你想過濾器根據標題或JSON對象的屬性? – Caleb

+0

@Caleb過濾器基於標題和扇區。只有那兩個領域。 – Skywalker

+0

我會建議在JSON對象中爲數據創建一個類。稍後過濾和我們會更容易。如果你不想這樣做,你可以用'let tempTitle = text [「caseStudyTitle」]來訪問標題和扇區! String'。 – Caleb

回答

1

您正在將一個NSDictionary投射到NSString

這裏是你如何篩選基於標題和部門:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
     // if let id = dta["caseStudyTitle"] as? String 
     filtered = dta.filter({ (text) -> Bool in 

     //Access the title and sectors 
     let tmpTitle = text["caseStudyTitle"] as! String 
     let tmpSector = text["sector"] as! String 

     //Create a range for both 
     let range1 = tmpTitle.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) 
     let range2 = tempSector.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) 
     print("THIS IS TEXT \(text)") 
     //Return true if either match 
     return range1 != nil || range2 != nil 

    }) 
    if(filtered.count == 0){ 
     searchActive = false; 
    } else { 
     searchActive = true; 
    } 
    self.tableView.reloadData() 
} 
+0

再次感謝caleb。我從中學到了一些東西。實現你的代碼後,我收到以下錯誤。 '類型的值範圍?沒有會員位置。「有關如何解決這個問題的任何建議? – Skywalker

+0

更新:將「as!String」更改爲「as!NSString」解決了此問題。雖然我不知道爲什麼。 – Skywalker

+0

@LorenzovonMatterhorn我忘記'rangeOfString'對'Strings'的作用是不同的。我上面的編輯也解決了這個問題。 – Caleb

0

您的dta數組包含兩個字典元素,而不是字符串元素。這就是爲什麼你會得到一個錯誤,說你不能將字典轉換成nsstring。

let tmp = text as! NSString

這裏,文本是字典,而不是字符串。