swift - IOS - swift将元素添加到TableView数据数组

我有一个popUpView,dropDownButton和dropDownTableView。

这是我的"DropDown.file":


 class dropDownView: UIView, UITableViewDelegate, UITableViewDataSource {



 var dropDownOptions = [String]()



 var tableView = UITableView()



 var delegate : dropDownProtocol!



 override init(frame: CGRect) {


 super.init(frame: frame)



 tableView.backgroundColor = UIColor.darkGray


 self.backgroundColor = UIColor.darkGray



 tableView.delegate = self


 tableView.dataSource = self



 tableView.translatesAutoresizingMaskIntoConstraints = false



 self.addSubview(tableView)



 tableView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true


 tableView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true


 tableView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true


 tableView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true



 }



 required init?(coder aDecoder: NSCoder) {


 fatalError("init(coder:) has not been implemented")


 }



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


 return 1


 }



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


 return dropDownOptions.count


 }



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


 let cell = UITableViewCell()



 cell.textLabel?.text = dropDownOptions[indexPath.row]


 cell.backgroundColor = UIColor.lightGray


 return cell


 }



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


 self.delegate.dropDownPressed(string: dropDownOptions[indexPath.row])


 self.tableView.deselectRow(at: indexPath, animated: true)


 }



}



protocol dropDownProtocol {


 func dropDownPressed(string : String)


}



//MARK: DropDownButton



class dropDownBtn: UIButton, dropDownProtocol {



 func dropDownPressed(string: String) {


 self.setTitle(string, for: .normal)


 self.dismissDropDown()


 }



 var dropView = dropDownView()



 var height = NSLayoutConstraint()



 override init(frame: CGRect) {


 super.init(frame: frame)



 self.backgroundColor = UIColor.lightGray



 dropView = dropDownView.init(frame: CGRect.init(x: 0, y: 0, width: 0, height: 0))


 dropView.delegate = self


 dropView.translatesAutoresizingMaskIntoConstraints = false


 }



 override func didMoveToSuperview() {


 self.superview?.addSubview(dropView)


 self.superview?.bringSubviewToFront(dropView)


 dropView.topAnchor.constraint(equalTo: self.bottomAnchor).isActive = true


 dropView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true


 dropView.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true


 height = dropView.heightAnchor.constraint(equalToConstant: 0)


 }



 var isOpen = false


 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {


 if isOpen == false {



 isOpen = true



 NSLayoutConstraint.deactivate([self.height])



 if self.dropView.tableView.contentSize.height > 150 {


 self.height.constant = 150


 } else {


 self.height.constant = self.dropView.tableView.contentSize.height


 }



 NSLayoutConstraint.activate([self.height])



 UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {


 self.dropView.layoutIfNeeded()


 self.dropView.center.y += self.dropView.frame.height / 2


 }, completion: nil)



 } else {


 isOpen = false



 NSLayoutConstraint.deactivate([self.height])


 self.height.constant = 0


 NSLayoutConstraint.activate([self.height])


 UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {


 self.dropView.center.y -= self.dropView.frame.height / 2


 self.dropView.layoutIfNeeded()


 }, completion: nil)



 }


 }



 func dismissDropDown() {


 isOpen = false


 NSLayoutConstraint.deactivate([self.height])


 self.height.constant = 0


 NSLayoutConstraint.activate([self.height])


 UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {


 self.dropView.center.y -= self.dropView.frame.height / 2


 self.dropView.layoutIfNeeded()


 }, completion: nil)


 }



 required init?(coder aDecoder: NSCoder) {


 fatalError("init(coder:) has not been implemented")


 }


}




// constrain dropDownbutton


 dropDownButton.centerXAnchor.constraint(equalTo: self.popUpView.centerXAnchor).isActive = true


 dropDownButton.centerYAnchor.constraint(equalTo: self.popUpView.centerYAnchor).isActive = true


 dropDownButton.widthAnchor.constraint(equalToConstant: 170).isActive = true


 dropDownButton.heightAnchor.constraint(equalToConstant: 40).isActive = true



 //Set the drop down menu's options


 dropDownButton.dropView.dropDownOptions.append("Main Wishlist")



到目前为止,工作正常,我的问题是,希望能够从另一个dropView.dropDownOptions中添加元素,现在,如果我从另一个函数添加一个元素,它只向数组添加元素,直到第一次出现popUpView,一旦我让它再次出现和消失,并尝试再次添加另一个元素,它就不工作,只显示旧数组,没有新的添加元素。

时间: 作者:

只要向数组追加新数据,简单的方法是从主线程重新加载表视图。

因此,在你的情况下,你只需在dropDownView类中添加一个公共方法即可追加数据,以下是示例:


func append(data: String) {


 dropDownOptions.append(data)



 DispatchQueue.async.main { [weak self] in 


 self?.tableView.reloadData()


 }


}



作者:
...