Swift3多按钮动态编码以触发事件

时间:2017-02-23 08:39:22

标签: swift xcode swift3 storyboard iboutlet

我有多个按钮。每个按钮都包含一个语言标签。

我想这样做,以便当用户点击按钮时,所选语言标签会根据点按的按钮更改其值。

所选语言插座名为SelectedLangText。

一个简单的解决方案是为每个按钮创建多个Action插座,并设置SelectedLangText标签的值。但是,如果有100个按钮,那将是糟糕的编码。

我不确定如何通过Web开发来解决Swift 3中的这种情况。

enter image description here

2 个答案:

答案 0 :(得分:1)

我更喜欢使用委托设计模式来解决像这样的问题我发现它比一个大量的@IBActions更清晰的方法

1-创建语言课程 进口基金会

class Language {
    var id: Int
    var name: String
    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}

2-在故事板或笔尖中创建自定义单元格,然后添加相应的插座和操作。然后为它创建一个委托协议

import UIKit
protocol CustomCellDelegate: class {
    func customCell(newLanguageSelected language: Language)
}
class CustomCell: UITableViewCell {
    var language: Language!
    @IBOutlet weak var languageTextLabel: UILabel!
    weak var delegate: CustomCellDelegate?
    func setupCustomCell(withLanguage language: Language){
        self.language = language
        self.languageTextLabel.text = self.language.name
    }
    @IBAction func buttonPressed(sender: UIButton){
        delegate?.customCell(newLanguageSelected: self.language)
    }
}

3-最后在UITableViewDataSource的cellForRow方法中添加实现,并在UITableViewController类中添加委托的实现

import UIKit
class YourTableViewController: UITableViewController{
    var languages: [Language] = []

    //implement the other methods in the dataSource

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuse", for: indexPath) as! CustomCell
        cell.delegate = self
        cell.setupCustomCell(withLanguage: languages[indexPath.row])
        return cell
    }
}
extension YourTableViewController: CustomCellDelegate{
    func customCell(newLanguageSelected language: Language) {
        //Do what you will with the language
    }
}
祝你好运

答案 1 :(得分:-1)

您可以为每个按钮添加标签,并为所有按钮设置相同的IBAction。

首先在您的方法中获取基于按钮的语言。 现在使用循环(与for循环一起使用,因为每个按钮需要适当的索引)并从其标记中获取所有按钮并设置语言标记。

一目了然有点复杂,但会在我眼中解决你的问题和良好的解决方案。

for index in 101...103 {
        let myBtn = self.view.viewWithTag(index) as! UIButton
        myBtn.setTitle("localisedtitle string", for: .normal)
}