WedX - журнал о программировании и компьютерных науках

UISearchBar со сгруппированным табличным представлением в Swift

Простите меня за то, что я не в состоянии разобраться в этом самостоятельно. Я изучил iOS в Swift и мало что узнал о Objective-C.

Я пытаюсь создать uisearchbar, который фильтрует сгруппированное табличное представление, состоящее из нескольких массивов для его разделов. По сути, мне нужно отфильтровать NSMutableArray, построенный из других массивов, чтобы получить результаты поиска (обычный массив не может быть скомпилирован в «разумное время»). Я просмотрел это руководство и понял, что мне нужно, но, к сожалению, В данном случае я не лучший, когда дело доходит до перевода Obj-c на Swift. Любая помощь (перевод) или направление к другим учебникам, которые помогут мне сделать это, очень ценятся. Я искал, искал и возился всю ночь, но я сдался, мне нужна помощь.

Изменить: до сих пор нет ответа


Ответы:


1

Он похож на код Objective-C, но давайте начнем отсюда.

После того, как вы создадите свой контроллер представления, табличное представление и компоненты панели поиска, в классе ViewController вы должны делегировать элементы ViewController, например:

tableView.delegate = self
tableView.dataSource = self
searchBar.delegate = self

И тогда вам нужно реализовать (переопределить) такие методы, как

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

    filtered = data.filter({ (text) -> Bool in
        let tmp: NSString = text
        let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
        return range.location != NSNotFound
    })
    if(filtered.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }
    self.tableView.reloadData()
}

объясняется здесь Делегирование

также вот справочное видео Youtube

Надеюсь, поможет

18.05.2015
  • Это не отвечает на вопрос, который я задаю:/ Я пытаюсь фильтровать NSMutableArray, построенный из других массивов. Не просто .filter через простой массив. Что я могу сделать. 18.05.2015

  • 2

    Добавьте эти методы UISearchBarDelegate в свой класс, и ваш класс должен подтвердить этот протокол, используя либо код self.yourSearchBar.delegate = self, либо раскадровку.

       func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchBar.resignFirstResponder()
    }
    
    
    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
    
        searchBar.text = ""
        searchBar.resignFirstResponder()
        self.searchedArrayToDisplay = self.listDataArray
    }
    
    
    func searchBarSearchButtonClicked(searchBar: UISearchBar) {
    
        searchBar.resignFirstResponder()
    }
    
    
    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    
        if searchText == "\n" {
    
            searchBar.resignFirstResponder()
        } else if searchText == "" {
    
        self.searchedArrayToDisplay = self.listDataArray
        } else {
    
            self.filterContentForSearchText(searchText)
        }
    }
    
    
    func filterContentForSearchText(searchText: String) {
    
        self.searchedArrayToDisplay = self.listDataArray.filter({(eachObject: [String:AnyObject]) -> Bool in
    
            let name = eachObject["name"] as! String
            let stringMatch = name.lowercaseString.rangeOfString(searchText.lowercaseString)
            let result = stringMatch != nil ? true : false
            return result
        })
    }
    

    Теперь в ячейке для метода индексного пути

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    
            let cell : UITableViewCell = UITableViewCell(style:UITableViewCellStyle.Value1, reuseIdentifier:"cell")
            var object = self.searchedArrayToDisplay[indexPath.row]
    }
    
    18.05.2015
  • Хорошо, это имеет смысл, однако вы не можете использовать .filter() на NSMutableArray, как в filterContentForSearchText. Мой listdataArray, как вы выразились, представляет собой NSMutableArray. Эта команда не является членом. Я считаю, что вы должны использовать NSPredicate или какой-то вариант ?? 18.05.2015
  • Кроме того, я попытался просто привести NSMutableArray к обычному массиву, чтобы использовать .filter. Но я получаю сообщение об ошибке: «Не удается вызвать фильтр» со списком аргументов типа «(([String: AnyObject]) -> Bool)»… какие-либо предложения для любого из них? 18.05.2015
  • Это я сделал с помощью Swift Array. если вы используете NSMutableArray, вам нужно использовать другую логику. Кстати, почему бы вам не использовать массив Swift. Это просто. 19.05.2015
  • Потому что быстрый массив не мог скомпилироваться в разумные сроки. Это очень большой массив данных. Есть идеи, как поступить с логикой для этого с NSMutableArray? 19.05.2015
  • let predicate = NSPredicate (формат: имя содержит [c] %@, argumentsArray: [searchText]) self.listDataArray.filterUsingPredicate (предикат) Что-то подобное вам нужно сделать. 19.05.2015
  • Это не будет работать с bool. Я только что дал вам предикат. Если хотите, я могу дать полный код. 19.05.2015
  • Буду очень признателен за полный код. Я полностью застрял здесь 19.05.2015
  • Привет @ Amit89, не могли бы вы предоставить код для этого? 26.05.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]