Ios DropDownlist在cell swift的每个文本字段中显示

Ios DropDownlist在cell swift的每个文本字段中显示,ios,swift,Ios,Swift,我定制了一个显示“下拉菜单”的UITextField。但是如果我在textField中写入,那么单元格的每个textField都会突然显示下拉列表。还有一个问题。我在stackView中有一个textfield。这个stackView位于cardwiew中(用于阴影)。这个cardwiew在单元格中。如何将此suggestionTable添加到单元格中,而不是使用super.super.super.addSuView(suggestionTable)添加到单元格中 open class Sugg

我定制了一个显示“下拉菜单”的
UITextField
。但是如果我在
textField
中写入,那么单元格的每个
textField
都会突然显示下拉列表。还有一个问题。我在
stackView
中有一个
textfield
。这个
stackView
位于
cardwiew
中(用于阴影)。这个
cardwiew
在单元格中。如何将此
suggestionTable
添加到单元格中,而不是使用
super.super.super.addSuView(suggestionTable)
添加到单元格中

open class SuggestionTextField: UITextField, UITextFieldDelegate {

var identifier = "SuggestionCell"
var suggestionTable:UITableView!
var suggestionlist = ["First","Second","Third","Four","Fifth","Sixth","Seven","eight","Nine","Ten"]
var filterSuggestionlist = [String]()
var heightConstraint:NSLayoutConstraint!
var defaultShow = true {
    didSet {
        self.suggestionTable.reloadData()
    }
}

convenience init() {
    self.init(
        frame: CGRect.zero)
    self.delegate = self
    NotificationCenter.default.addObserver(self, selector: #selector(filterSuggestions), name: NSNotification.Name.UITextFieldTextDidChange, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

override init(frame: CGRect) {
    super.init(frame: frame)
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.delegate = self
    NotificationCenter.default.addObserver(self, selector: #selector(filterSuggestions), name: NSNotification.Name.UITextFieldTextDidChange, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

func keyboardWillShow(_ notification: Notification) {

    let keyboardFrame = ((notification as NSNotification).userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    guard let frame = self.superview?.convert(self.frame, to: UIApplication.shared.keyWindow) else { return }
    //guard let frame = self.superview?.convert(self.frame, to: nil) else { return }
    let gap = (UIScreen.main.bounds.size.height - frame.origin.y - frame.height - keyboardFrame.height)
    guard suggestionTable != nil else {
        return
    }
    heightConstraint.constant = gap
}

func keyboardWillHide(_ notification: Notification) {
}

func filterSuggestions(){
    self.setup()
    if (self.text?.isEmpty)! {
        self.defaultShow = true
        return
    }

    filterSuggestionlist = suggestionlist.filter({ (suggestion) -> Bool in
        return suggestion.contains(self.text!)
    })
    self.defaultShow = false
}

func setup(){

    guard suggestionTable == nil else {
        return
    }
    suggestionTable = UITableView()
    suggestionTable.allowsSelection = true
    suggestionTable.dataSource = self
    suggestionTable.delegate = self
    suggestionTable.estimatedRowHeight = 40
    suggestionTable.rowHeight = UITableViewAutomaticDimension
   // suggestionTable.layer.masksToBounds = false
   // suggestionTable.clipsToBounds = false
    suggestionTable.contentInset = UIEdgeInsets.zero
    suggestionTable.separatorStyle  = .none
    suggestionTable.layer.cornerRadius = 3
    suggestionTable.layer.shadowColor = UIColor.black.cgColor
    suggestionTable.layer.shadowOffset = CGSize(width: 2, height: 3)
    suggestionTable.layer.shadowOpacity = 0.5
    suggestionTable.showsVerticalScrollIndicator = true
    suggestionTable.translatesAutoresizingMaskIntoConstraints = false
    suggestionTable.register(suggestionCell.self, forCellReuseIdentifier: identifier)
    superview?.superview?.superview?.superview?.addSubview(suggestionTable)
    superview?.superview?.superview?.superview?.bringSubview(toFront: suggestionTable)
    setupConstrain()
}

func setupConstrain(){

    let leftConstraint = NSLayoutConstraint(item: suggestionTable, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1, constant: 0)
    let rightConstraint =  NSLayoutConstraint(item:
        suggestionTable, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: 0)
    let topConstraint = NSLayoutConstraint(item: suggestionTable, attribute: .top, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1, constant: 2)
    heightConstraint = NSLayoutConstraint(item: suggestionTable, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 200)
    NSLayoutConstraint.activate([leftConstraint, rightConstraint, topConstraint, heightConstraint])
}

func removeSuggestionView(){

    guard suggestionTable != nil else {
        return
    }
    suggestionTable.removeFromSuperview()
    suggestionTable = nil

}

public func textFieldDidBeginEditing(_ textField: UITextField) {
    self.setup()
}

public func textFieldDidEndEditing(_ textField: UITextField) {
    removeSuggestionView()
}

public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    _  = self.resignFirstResponder()
    return true
}

}

extension SuggestionTextField : UITableViewDelegate ,UITableViewDataSource {

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

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return defaultShow ? suggestionlist.count : filterSuggestionlist.count
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! suggestionCell
    cell.textLabel?.text = defaultShow ? suggestionlist[indexPath.row] : filterSuggestionlist[indexPath.row]
    cell.textLabel?.textColor = UIColor.black
    cell.textLabel?.textAlignment = .center
    cell.textLabel?.adjustsFontSizeToFitWidth = true
    return cell
}

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.text = defaultShow ? suggestionlist[indexPath.row] : filterSuggestionlist[indexPath.row]
    if !self.defaultShow {
        self.defaultShow = !self.defaultShow
    }
    tableView.deselectRow(at: indexPath, animated: true)
}
}


谢谢

我想,您可以在textfield中设置resignFirstResponder(),或者在textfield中设置becomeFirstResponder(),以便在textfield其他位置轻松控制。

我想,您可以在textfield中设置resignFirstResponder(),或者设置becomeFirstResponder()在textfield other中轻松控制。

我认为,因为您所有的文本字段都有Observer可在键盘上显示和关闭,而在您调用setup()的每个Observer中,我都解决了这个问题。这是因为“UITextField”textChange Observer。我把它移到becomeFirstResponder()中,它被修复了。我想,因为你所有的文本字段都有一个观察者要在键盘上显示和删除,在你调用setup()的每个观察者中,我都解决了它。这是因为“UITextField”textChange Observer。我把它移到becomeFirstResponder()中,它被修复了。第二个问题有解决方案吗?第二个问题有解决方案吗?