2016-04-14 2 views
0

Я работаю над приложением IOS, используя Swift и я использую NSMutableArray, и когда я пытаюсь добавить UISearchController к моему UITableViewController Это дает мне эту ошибкуКак я могу Фильтрация Использование NSMutableArray и UISearchController

1.1 click here, please

Но когда я пытаюсь это сделать с NSArray, он отлично работает.

Если вам интересно, почему я использую NSMutableArray? Потому что мне это нужно, чтобы передать объект NSMutableArray, который находится в выбранной строке из UITableViewController в другой UIViewController, как это: 1.2 click here, please

Что я должен делать теперь, как я могу добавив строку поиска? Спасибо заранее.

ответ

0

Вы можете взломать его, преобразовывая изменяемый массив в nsarray, а затем используя это.

Где делают ваши вещи в 1.1 просто добавьте перед self.businessNamesArray линии добавьте эту строку

вар regArray = self.businessNamesArray в NSArray, как! [String]

затем измените self.businessNamesArray строку regArray.filter {Остальная часть кода здесь

+0

Я сделал это: ** 1) ** преобразования NSMutableArray в NSArray 'вар BusinessNamesArray = [строка ]() '** 2) ** Затем, используя это:' var BusinessNamesArrayAfterConverting = self.BusinessNamesArray как NSArray as! [String] 'в функции' prepareForSegue'. Но когда я пытаюсь использовать его, он дает мне эту ошибку: _Вод типа «UITableViewController» не имеет члена «BusinessNamesArrayAfterConverting» – Sara

+0

Я не следую вашему шагу 1), создав новый NSArray, называемый BusinessNmesArray? вы пытаетесь сделать это var BusinessNamesArrayAfterConverting = [String]() BusinessNamesArrayAfterConverting = self.BusinessNamesArray как NSArray as! [String] – ray

+0

, прежде чем я спрошу 'BusinessNamseArray', был NSMutableArray, но после вашего ответа я удаляю его и делаю то, что я написал в предыдущем комментарии. Я не знаю, вот что я получил. Можете ли вы сказать мне, что вы предлагаете мне делать с подробностями?, Пожалуйста. – Sara

0

Если вы используете регулярные Swift массивы, которые я думаю, это правильная идея, так как вы используете Swift, вам может заставить его работать, если вы измените тип переменной массива и исправьте синтаксис фильтрации массива. Во-первых, изменить объявление массива на это:

var BusinessNamesArray:[String]? 

filter ваша функция используется на ваших self.BusinessNamesArray возвращает отфильтрованный массив, а не фильтрации массива на месте (что кажется, что вы хотите). Если вы хотите заменить содержание вашего self.BusinessNamesArray, вам нужно будет сделать что-то вроде этого:

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    self.BusinessNamesArray = self.BusinessNamesArray.filter { (business:String) -> Bool in 
     return true 
     // You probably want to compare strings here like this instead: 
     // guard let searchText = searchController.searchBar.text else { 
     //  return false 
     // } 
     // return business.hasPrefix(searchText) 
    } 
    // You probably also need to reload your table view at this point: 
    self.tableView.reloadData() 
} 

Имейте в виду, что хотя ваш BusinessNamesArray теперь отфильтрована, и вы не можете не-фильтр он. Вместо этого вы должны, вероятно, сохранить второй массив своих строк, называемый как-то вроде searchResults. Затем вы можете использовать это для фильтрации и сохранения исходного списка бизнес-имен в исходном массиве. Таким образом, вы бы добавили переменную класса с именем var searchResults:[String]?, и код фильтрации поиска изменился бы.

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    self.searchResults = self.BusinessNamesArray.filter { (business:String) -> Bool in 
     guard let searchText = searchController.searchBar.text else { 
      return false 
     } 
     return business.hasPrefix(searchText) 
    } 
    self.tableView.reloadData() 
} 

При вызове reloadData на вашем табличном на данный момент, вы, вероятно, хотите, чтобы проверить и посмотреть, если ваш контроллер поиска активен в numberOfSectionsInTableView, а также другие функции делегата вид таблицы делегата и использовать searchResults массив, если он активен и BusinessNamesArray, если его нет - что-то вроде:.

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    if (self.resultSearchController.active) { 
     return self.searchResults.count ?? 0 
    } else { 
     return self.BusinessNamesArray.count ?? 0 
    } 
} 

(переменная self.resultSearchController является локальным экземпляром UISearchController я не уверен, что вы назвали ваши.)

Вы затем использовать подобный код, чтобы решить, какие элементы, чтобы захватить для prepareForSegue: код:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Guard your variables here so you can return early if they're 
    // not valid 
    guard let upcoming = segue.destinationViewController as? DetailsViewController, 
       myindexpath = self.tableView.indexPathForSelectedRow else { 
     return 
    } 

    var titleString = "" 
    if (self.resultSearchController.active) { 
     if let searchResults = self.searchResults { 
      titleString = searchResults[myindexpath.row] 
     } 
    } else { 
     if let businessNames = self.BusinessNamesArray { 
      titleString = businessNames[myindexpath.row] 
     } 
    } 
    upcoming.titleString = titleString 

    self.deselectRowAtIndexPath(myindexpath, animated: true) 
} 
Смежные вопросы