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

Swift3多按钮动态编码触发事件,swift,xcode,swift3,storyboard,iboutlet,Swift,Xcode,Swift3,Storyboard,Iboutlet,我有多个按钮。每个按钮都包含一个语言标签 我希望这样,当用户点击按钮时,所选语言标签会根据点击的按钮更改其值 所选语言出口称为SelectedLangText 一个简单的解决方案是为每个按钮创建多个操作出口,并设置SelectedLangText标签的值。然而,如果有100个按钮,那将是糟糕的编码 我不确定如何在来自web开发的Swift 3中处理这种情况 您可以为每个按钮添加标签,并为所有按钮设置相同的iAction 首先,在您的方法中,获取基于按钮的语言。 现在使用循环(使用for循环,因为

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

我希望这样,当用户点击按钮时,所选语言标签会根据点击的按钮更改其值

所选语言出口称为SelectedLangText

一个简单的解决方案是为每个按钮创建多个操作出口,并设置SelectedLangText标签的值。然而,如果有100个按钮,那将是糟糕的编码

我不确定如何在来自web开发的Swift 3中处理这种情况


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

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

乍一看有点复杂,但在我看来会解决你的问题和很好的解决方案

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

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

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

乍一看有点复杂,但在我看来会解决你的问题和很好的解决方案

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

我更喜欢在解决这样的问题时使用委托设计模式,因为我发现它比大量的@iAction更干净

1-创建一个语言类 进口基金会

class Language {
    var id: Int
    var name: String
    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}
2-在故事板或nib中创建自定义单元格,然后添加适当的出口和操作。然后为它创建一个委托协议

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
    }
}

祝你好运

在解决这样的问题时,我更喜欢使用委托设计模式。对于它,我发现它是一种比大量@iActions更干净的方法

1-创建一个语言类 进口基金会

class Language {
    var id: Int
    var name: String
    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}
2-在故事板或nib中创建自定义单元格,然后添加适当的出口和操作。然后为它创建一个委托协议

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
    }
}

祝你好运

在哪里可以添加标签?是标识符吗?对不起,我真的不知道从哪里开始。我还没有真正学会斯威夫特。您能提供一个示例代码段吗?在界面生成器中的按钮属性中。。。。或者,如果您有许多记录,或者只使用表视图,您也可以在运行时生成按钮。@ThomasCharlesworth,如果您很忙,我可以提供代码段。但我建议你尽你最大的努力一次。无论如何,在接下来的5分钟内,我会给你发送代码片段,让你在swift 3中获得带有标签的按钮。我在哪里可以添加标签?是标识符吗?对不起,我真的不知道从哪里开始。我还没有真正学会斯威夫特。您能提供一个示例代码段吗?在界面生成器中的按钮属性中。。。。或者,如果您有许多记录,或者只使用表视图,您也可以在运行时生成按钮。@ThomasCharlesworth,如果您很忙,我可以提供代码段。但我建议您尽最大努力一次。无论如何,在接下来的5分钟内,您应该尝试使用动态内容而不是静态内容创建tableView,并向您发送代码片段以获取swift 3中带有标记的按钮。这将允许您支持无限量的语言。Word of advice在iOS中键入变量名和方法时使用小写。我马上写一个答案。我假设您知道如何使用UITableViewDataSource,并且知道如何创建自定义单元格。您应该尝试使用动态内容而不是静态内容创建tableView。这将允许您支持无限量的语言。Word of advice在iOS中键入变量名和方法时使用小写。我马上写一个答案。我的假设是,您知道如何使用UITableViewDataSource,并且知道如何创建自定义单元格。对于如此小的任务来说,这似乎是一种极端的过度使用。我真的需要这么多代码吗?如果你想有很多单元格,这是正确的方法。而且对于阅读代码的人来说也更好。它提供了一种更优雅、更清晰的方法。对于如此小的任务来说,这似乎是一种极端的过度使用。我真的需要这么多代码吗?如果你想有很多单元格,这是正确的方法。而且对于阅读代码的人来说也更好。它提供了一种更优雅、更清晰的方法。