gpt4 book ai didi

ios - Swift - 将元素添加到 TableView 数据数组

转载 作者:行者123 更新时间:2023-11-28 23:23:02 26 4
gpt4 key购买 nike

我有一个问题,元素没有被添加到我的 TableView-array

我的设置很复杂..

我有一个 popUpView,其中有一个带有 dropDownTableViewdropDownButton

这是我的“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")
}
}

所以我所做的是在我的 ViewController 中创建 dropDownButton 并在 popUpView 出现时对其进行约束像这样并添加第一个元素:

// 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")

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

我尽量把它解释得通俗易懂。如果有任何不清楚的地方,请告诉我,我会尽力详细说明:)

最佳答案

简单的方法是每当新数据附加到数组时从主线程重新加载 TableView 。

因此,在您的情况下,您可以简单地在 dropDownView 类中添加一个公共(public)方法来附加数据。这是示例:

func append(data: String) {
dropDownOptions.append(data)

DispatchQueue.async.main { [weak self] in
self?.tableView.reloadData()
}
}

关于ios - Swift - 将元素添加到 TableView 数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59340368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com