当搜索栏成为第一响应者时更改表格 - swift

Posted

技术标签:

【中文标题】当搜索栏成为第一响应者时更改表格 - swift【英文标题】:Change table when search bar becomes first responder - swift 【发布时间】:2017-07-11 01:14:06 【问题描述】:

您好,当搜索栏成为第一响应者时,我正在尝试更改表格中的单元格。理想情况下,我希望我的添加朋友表最初显示朋友请求,当搜索栏成为第一响应者时,它将更改单元格以显示在搜索栏中键入的内容的搜索结果。这是我当前的代码:

class UserFriendRequestController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate 

let titleCell = "titleCell"
let cellId = "cellId"
let contactSearch = "contactSearch"
var searchBar = UISearchBar()
var addFriendsTable: UITableView = UITableView()
let users = NSMutableArray()

override func viewDidLoad() 
    super.viewDidLoad()

    view.addSubview(addFriendsTable)

    let img = UIImage(named: "white-screen")
    self.navigationController?.navigationBar.shadowImage = img
    self.navigationController?.navigationBar.setBackgroundImage(img, for: UIBarMetrics.default)

    navigationItem.title = "Add Contact"
    self.navigationController?.navigationBar.titleTextAttributes = [ NSFontAttributeName: UIFont(name: "Nunito", size: 18.5)!, NSForegroundColorAttributeName: UIColor(r: 86, g: 214, b: 209)]

    addFriendsTable.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height - (70))
    addFriendsTable.delegate = self
    addFriendsTable.dataSource = self
    searchBar.sizeToFit()
    searchBar.searchBarStyle = .minimal
    searchBar.placeholder = "Search Conctacts"
    searchBar.showsCancelButton = true
    searchBar.delegate = self
    addFriendsTable.tableHeaderView = searchBar
    addFriendsTable.contentOffset = CGPoint(x: 0.0, y: 0.0)

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSFontAttributeName : UIFont(name: "Nunito", size: 15)!,  NSForegroundColorAttributeName : UIColor(r: 78, g: 78, b: 78)
        ], for: .normal)

    var image = UIImage(named: "back_button_thick")
    image = image?.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
    navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(handleBack))

    addFriendsTable.register(UserFriendRequestsCell.self, forCellReuseIdentifier: cellId)
    addFriendsTable.register(FriendRequestsTitleCell.self, forCellReuseIdentifier: titleCell)
    addFriendsTable.register(AddFriendRequestCell.self, forCellReuseIdentifier: contactSearch)
    addFriendsTable.separatorColor = UIColor(r: 225, g: 225, b: 225)

    setup()


func setup() 
    for i in 1 ..< 20 
        let user = User()
        users.add(user)
    



func searchBarCancelButtonClicked(_ searchBar: UISearchBar) 
    searchBar.text = nil
    searchBar.resignFirstResponder()


func handleBack() 
    dismiss(animated: true, completion: nil)



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


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

    if self.searchBar.isFirstResponder 
        let cell = tableView.dequeueReusableCell(withIdentifier: contactSearch, for: indexPath) as! AddFriendRequestCell
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        cell.textLabel?.text = "Instagram User Name"
        cell.textLabel?.font = UIFont(name: "Nunito", size: 16)
        cell.textLabel?.textColor = UIColor(r: 51, g: 51, b: 51)
        cell.detailTextLabel?.text = "Instagram Handle"
        cell.detailTextLabel?.font = UIFont(name: "Nunito", size: 13)
        cell.detailTextLabel?.textColor = UIColor.darkGray
        cell.profileImageView.image = UIImage(named: "profilepic")
        cell.separatorInset.left = CGFloat(55)
        cell.separatorInset.right = CGFloat(5)
        let user = users[indexPath.row] as! User
        cell.configure(user: user)
        return cell
     else 
        if indexPath.row == 0 

            let cell = tableView.dequeueReusableCell(withIdentifier: titleCell, for: indexPath) as! FriendRequestsTitleCell
            cell.selectionStyle = UITableViewCellSelectionStyle.none
            return cell

         else 
            let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! UserFriendRequestsCell
            cell.selectionStyle = UITableViewCellSelectionStyle.none
            cell.textLabel?.text = "Instagram User Name"
            cell.textLabel?.font = UIFont(name: "Nunito", size: 16)
            cell.textLabel?.textColor = UIColor(r: 51, g: 51, b: 51)
            cell.detailTextLabel?.text = "Instagram Handle"
            cell.detailTextLabel?.font = UIFont(name: "Nunito", size: 13)
            cell.detailTextLabel?.textColor = UIColor.darkGray
            cell.profileImageView.image = UIImage(named: "profilepic")
            cell.separatorInset.left = CGFloat(55)
            cell.separatorInset.right = CGFloat(5)

            return cell
        
    


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat

    if self.searchBar.isFirstResponder 
        return 55
    

    else 
        if indexPath.row == 0 
            return 30
         else 
            return 55
        
    


【问题讨论】:

【参考方案1】:

为此,我建议查看UISearchBarDelegate 中的其他方法,特别是searchBarTextDidBeginEditing()searchBarTextDidEndEditing()。在这些委托方法中的每一个中,您都可以调用 [self.tableView reloadData] 来更新所有单元格。

另外,实现FriendRequestsTitleCell 的另一种方法是将自定义标题视图添加到您的表格视图中,因为您使用的单元格只会出现在表格视图的顶部。

【讨论】:

以上是关于当搜索栏成为第一响应者时更改表格 - swift的主要内容,如果未能解决你的问题,请参考以下文章

当 UISearchBar 成为横向的第一响应者时,模态视图移动

UISearchController 需要额外点击才能成为第一响应者

让搜索栏成为第一响应者

视图加载时使 UISearchBar 成为第一响应者

如何在 Swift 中同步表格视图和搜索栏选择?

使搜索功能快速响应 ui 搜索栏中键入的文本 [swift]