索引超出范围UISearchController

时间:2018-05-20 17:50:27

标签: ios swift uitableview uisearchbar uisearchcontroller

我正在尝试获取您在尝试将参与者添加到组时在whatsapp中找到的行为。在tableView中我实现了UISearchController 当在tableView中选择一个新行时,会为其分配一个填充图像(请参见下面的屏幕截图),并在selectedUsers中添加/删除它。当我开始在searchBar中搜索时,会重新排列并且我得到索引超出范围错误,这是正常的。我不知道从哪里开始。

范围:

  • 允许用户添加/删除用户,无论searchBar是否处于活动状态
  • 确保selectedUsers中没有重复的用户。这将保存到DataBase。
  • 删除searchBar上附带的取消按钮。

我尝试了什么?

class GroupRegistrationViewController: UITableViewController {

     let searchController = UISearchController(searchResultsController: nil)

     var usersArray = [User]() //users that currentUser is following
     var currentUser: User!

     var selectedUsers = [User]() //selected users in this controller, selected users we follow

     var filteredUsers = [User]() //this property will hold the Users that the currentUser is searching for



     override func viewDidLoad() {
        super.viewDidLoad()

        self.fetchUsers()
        navigationItem.title = "GroupRegistration"
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        tableView.tableHeaderView = searchController.searchBar
        searchController.searchBar.placeholder = "Search Members"
        searchController.hidesNavigationBarDuringPresentation = false   
     }    

       override func numberOfSections(in tableView: UITableView) -> Int {
          return 1
       }

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

         //simply check whether the user is searching or not
         if isFiltering() {
             return filteredUsers.count
         }
         return usersArray.count
     }


       override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "GroupRegistrationTableViewCell") as! GroupRegistrationTableViewCell

        if isFiltering() {
            cell.user = filteredUsers[indexPath.row]

        }else{
            cell.user = usersArray[indexPath.row]
        }

        if selectedUsers.contains(cell.user) {
            //User type conforms to Equatable protocol so check is allowed
            cell.added = true
        }
        return cell
    }


     //this method determines if you are currently filtering results or not
     func isFiltering() -> Bool {
        return searchController.isActive && !searchBarIsEmpty()
     }

     func searchBarIsEmpty() -> Bool {
        return searchController.searchBar.text?.isEmpty ?? true
    }

     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

         let cell = tableView.cellForRow(at: indexPath) as! GroupRegistrationTableViewCell

         cell.added = !cell.added

         if cell.added == true {
            self.addRecipient(user: cell.user)
         }else{
            let index = selectedUsers.index(of: cell.user)!
            self.deleteRecipient(user: cell.user, index: index)
         }
     }



     // - Helper methods
     // - add
     // - delete
     func addRecipient(user: User) {
         self.selectedUsers.append(user)
     }

     func deleteRecipient(user: User, index: Int) {
         selectedUsers.remove(at: index)
     }
    }//end of class


    extension GroupRegistrationViewController {

     //get users from firebase
     func fetchUsers() {
        DatabaseReference.users(uid: currentUser.userUID).reference().child("follows").observe(.childAdded, with: { (snapshot) in

            let user = User(dictionary: snapshot.value as! [String:Any])
            self.usersArray.insert(user, at: 0)
            let indexPath = IndexPath(row: 0, section: 0)
            self.tableView.insertRows(at: [indexPath], with: .fade)
         })
       }
    }


     //UISearchResultsUpdating Delegate
     extension GroupRegistrationViewController: UISearchResultsUpdating {

    func filteredContentForSearchText(searchText: String, scope: String = "All") {

        filteredUsers = usersArray.filter({ (user) -> Bool in
         return user.fullName.lowercased().contains(searchText.lowercased())
        })
        tableView.reloadData()
     }

    /*
      whenever the user adds or removes text in the search bar, the UISearchController will inform the GroupRegistrationViewController class of the change via a call to updateSearchResults(for:), which in turn calls filterContentForSearchText(_:scope:).
      */
      func updateSearchResults(for searchController: UISearchController) {
        filteredContentForSearchText(searchText: searchController.searchBar.text!)
        searchController.searchBar.showsCancelButton = false
        //CancelButton shows up when I tap for the first time in the search bar. !!!! - not desired behaviour.
        //CancelButton disapears when I start typing
        }  
      }




  `class GroupRegistrationTableViewCell: UITableViewCell {`

    @IBOutlet weak var profileImageView: UIImageView!
    @IBOutlet weak var displayNameLabel: UILabel!
    @IBOutlet weak var checkboxImageView: UIImageView!
    @IBOutlet weak var fullNameTextLabel: UILabel!


    var user: User! {
        didSet {
            self.updateUI()
        }
    }

    //when a row is selected added property is assigned true/false value
    var added: Bool = false  {
        didSet{
            if added == false {
                checkboxImageView.image = UIImage(named: "icon-checkbox")
            }else  {
                checkboxImageView.image = UIImage(named: "icon-checkbox-filled")
            }
        }
    }

    //add cache here
    var cache = SAMCache.shared()


    func updateUI() {

        let profilePictureKey = "\(user.userUID)-profilePicture"

        if let image = cache?.image(forKey: profilePictureKey){
            self.profileImageView.image = image
            self.profileImageView.layer.cornerRadius = self.profileImageView.bounds.width / 2.0
            self.profileImageView.layer.masksToBounds = true
        } else {
            user.downloadProfilePicture { (image, error) in
                self.cache?.setImage(image, forKey: profilePictureKey)
                self.profileImageView.image = image
                self.profileImageView.layer.cornerRadius = self.profileImageView.bounds.width / 2.0
                self.profileImageView.layer.masksToBounds = true
            }
        }

        displayNameLabel.text = user.username
        checkboxImageView.image = UIImage(named: "icon-checkbox")
        fullNameTextLabel.text = user.fullName
    }
  `}//end of class`

enter image description here enter image description here

0 个答案:

没有答案