开发者社区> 问答> 正文

SWIFT-将元素添加到TableView数据数组

在没有将元素添加到TableView-array.

我的设计相当复杂..。

我有一个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")
}

} 所以我所做的就是创建dropDownButton在我的ViewController和constrain如果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")

到目前为止,还不错。我的问题是,我希望能够将元素添加到dropView.dropDownOptions从另一个func...现在,如果我从另一个函数中添加一个元素,它只会将元素添加到数组中,直到我允许popUpView第一次出现。当我让它再次出现并消失,并再次尝试添加另一个元素时,它就无法工作,它只是显示没有新添加元素的旧数组。

我试着尽可能简单地解释这件事。如果有什么不清楚的地方,请告诉我,我会尽量详细说明的:)

展开
收起
游客5akardh5cojhg 2019-12-15 17:15:48 785 0
1 条回答
写回答
取消 提交回答
  • 简单的方法是,每当添加到数组的新数据时,从主线程重新加载表视图。

    因此,在您的示例中,您可以简单地在DroDownView类中添加一个公共方法来附加数据。下面是一个例子:

    func append(data: String) {
       dropDownOptions.append(data)
    
       DispatchQueue.async.main { [weak self] in 
         self?.tableView.reloadData()
       }
    }
    
    2019-12-15 17:16:17
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关课程

更多

相关电子书

更多
OpenStack Swift 海量小文件优化之路 立即下载
From Java/Android to Swift iOS 立即下载
Swift在Airbnb的应用实践 立即下载