Не удается обновить количество строк в соответствии с выбранным массивом? - PullRequest
1 голос
/ 04 мая 2019

Прежде всего, извините за длинные коды, приведенные ниже.Это потому, что я не могу выяснить, что мне не хватает или неправильно

Я хочу отображать массивы в табличном представлении в соответствии с нажатой кнопкой ... и когда пользовательский поиск ... должен фильтровать табличное представление ... Все работает нормально, когда я даю статическое трехзначное значение в количестве строк. В противном случае табличное представление просто пустое.

class RegisterViewController: UIViewController {

    @IBOutlet var txtUser: UITextField!
    @IBOutlet var txtPhone: UITextField!
    @IBOutlet var txtEmail: UITextField!
    @IBOutlet var SelectionView: UIView!
    @IBOutlet var pickerTableView: UITableView!
    @IBOutlet var btnDawat: UIButton!
    @IBOutlet var btnCountry: UIButton!
    @IBOutlet var btnNationality: UIButton!

    @IBOutlet var searchItems: UISearchBar!
    let manager = APIManager()

    var isSearching = Bool()

    enum options {
        case dawat
        case country
        case nationality
    }

    var lastSelection:options?

    override func viewDidLoad() {
        super.viewDidLoad()

        isSearching = false

        manager.parsingGet(url: BaseURL.countries) { (JSON, Bool) in


            let dict = JSON.dictionaryObject
            let countries = dict!["data"] as! NSArray
            signUser.countries = countries as! [String]
            let nations = dict!["data"] as! NSArray
            signUser.nationalities  = nations as! [String]               

        }

            pickerTableView.reloadData()

    }


    @IBAction func DawatTitleSelectionAction(_ sender: UIButton) {

        lastSelection = options.dawat
        pickerTableView.reloadData()
        SelectionView.center = self.view.center
        self.view.addSubview(SelectionView)

    }

    @IBAction func CountrySelectionButton(_ sender: UIButton) {

        lastSelection = options.country
        pickerTableView.reloadData()
        SelectionView.center = self.view.center
        self.view.addSubview(SelectionView)

    }

    @IBAction func NationalitySelectionAction(_ sender: UIButton){

        lastSelection = options.nationality
        pickerTableView.reloadData()
        SelectionView.center = self.view.center
        self.view.addSubview(SelectionView)            
    }

    @IBAction func RegisterButtonPressed(_ sender: UIButton) {


    //    Signup.email = self.txtEmail.text!
    //    Signup.phone = self.txtPhone.text!

    }

    @IBAction func pickerSelectButton(_ sender: UIButton) {            

        SelectionView.removeFromSuperview()            

    }        
}

// просмотр таблицы и функция поиска

    extension RegisterViewController : UITableViewDataSource,UITableViewDelegate  {


    func numberOfSections(in tableView: UITableView) -> Int {

        return 1

    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

          print(signUser.tableData.count)

        return signUser.tableData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PickerTableViewCell

        if isSearching == false{
           // print("presenting raw data")

            switch lastSelection!{

            case .country:
              //  print("raw countries list")
                signUser.unfilteredArray = signUser.countries
            case .nationality:
               // print("raw nationalities list")
                signUser.unfilteredArray = signUser.nationalities
            case .dawat:
                signUser.unfilteredArray = signUser.dawatTitles

            }

           signUser.tableData = signUser.unfilteredArray

         }

        else {
           // print("presenting filtered data")


            switch lastSelection!{

            case .country:
               // print("filtered countries")
                signUser.countries = signUser.filteredArray
                signUser.tableData = signUser.filteredArray
            case .nationality:
               // print("filtered nationalities")
                 signUser.nationalities = signUser.filteredArray
                signUser.tableData = signUser.filteredArray
            case .dawat:
                 signUser.dawatTitles = signUser.filteredArray
                signUser.tableData = signUser.filteredArray
            }

        }
            cell.lblTitle.text = signUser.tableData[indexPath.row]
            return cell            
    }


extension RegisterViewController : UISearchBarDelegate {


    //searchbar

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

        signUser.filteredArray.removeAll(keepingCapacity: false)

        if let searchText = searchItems.text, !searchText.isEmpty {

            isSearching = true

            let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchText)

            signUser.filteredArray = (signUser.unfilteredArray as NSArray).filtered(using: searchPredicate) as! [String]


        }

        else {

            signUser.tableData = signUser.unfilteredArray
            isSearching = false

        }            

        pickerTableView.reloadData()            
    }

    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {

        isSearching = false

    }
}

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Изменить методы действия кнопки для изменения signUser.tableData

@IBAction func DawatTitleSelectionAction(_ sender: UIButton) {

    lastSelection = options.dawat
    signUser.filteredArray = signUser.dawatTitles
    signUser.unfilteredArray = signUser.dawatTitles
    signUser.tableData = isSearching ? signUser.filteredArray : signUser.unfilteredArray
    pickerTableView.reloadData()
    SelectionView.center = self.view.center
    self.view.addSubview(SelectionView)

}

@IBAction func CountrySelectionButton(_ sender: UIButton) {

    lastSelection = options.country
    signUser.filteredArray = signUser.countries
    signUser.unfilteredArray = signUser.countries
    signUser.tableData = isSearching ? signUser.filteredArray : signUser.unfilteredArray
    pickerTableView.reloadData()
    SelectionView.center = self.view.center
    self.view.addSubview(SelectionView)

}

@IBAction func NationalitySelectionAction(_ sender: UIButton){

    lastSelection = options.nationality
    signUser.filteredArray = signUser.nationalities
    signUser.unfilteredArray = signUser.nationalities
    signUser.tableData = isSearching ? signUser.filteredArray : signUser.unfilteredArray
    pickerTableView.reloadData()
    SelectionView.center = self.view.center
    self.view.addSubview(SelectionView)
}

Обновить методы делегата tableView

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print(signUser.tableData.count)
    return signUser.tableData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PickerTableViewCell
    cell.lblTitle.text = signUser.tableData[indexPath.row]
    return cell
}

Обновить методы делегата панели поиска

extension RegisterViewController : UISearchBarDelegate {
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            if let searchText = searchItems.text, !searchText.isEmpty {
                isSearching = true
                let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchText)
                signUser.filteredArray = (signUser.unfilteredArray as NSArray).filtered(using: searchPredicate) as! [String]
                signUser.tableData = signUser.filteredArray
            }
            else {
                signUser.tableData = signUser.unfilteredArray
                isSearching = false
            }
            pickerTableView.reloadData()
        }
        func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
            isSearching = false
        }
}
1 голос
/ 04 мая 2019
  • Используйте два массива, массив без фильтрации и фильтрованный, например,

    var tableData = [Model]()
    var filteredArray = [Model]()
    

    и , никогда , замените tableData фильтрованным содержимым.

  • В searchBar:textDidChange отфильтруйте данные по lastSelection, заполните filteredArray и установите isSearching.

  • В методах источника данных отобразите данныев зависимости от состояния isSearching (упрощенно)

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return isSearching ? filteredArray.count : tableData.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PickerTableViewCell
        let item : Model
        if isSearching {
           item = filteredArray[indexPath.row]
        } else {
           item = tableData[indexPath.row]
        }
        // assign the values of item to the UI
        return cell
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...