【问题标题】:Swift3 Multiple buttons dynamic coding to trigger eventSwift3 多按钮动态编码触发事件
【发布时间】:2017-07-13 15:17:14
【问题描述】:

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

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

选定的语言出口称为 SelectedLangText。

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

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

【问题讨论】:

  • 您应该尝试使用动态内容而不是静态内容创建 tableView。这将允许您支持无限数量的语言。在 iOS 中键入变量名称和方法时,建议使用小写字母。我会在一秒钟内写一个答案。我假设您知道如何使用 UITableViewDataSource 并且您知道如何创建自定义单元格

标签: swift xcode swift3 storyboard iboutlet


【解决方案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
    }
}

祝你好运

【讨论】:

  • 对于这么小的任务来说,这看起来像是极端的矫枉过正。我真的需要这么多代码吗?
  • 如果您想拥有很多单元格,这是正确的方法。对于阅读代码的人来说,它也更好。它提供了一种更优雅、更清晰的方法。
【解决方案2】:

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

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

乍一看有点复杂,但会解决你的问题和我眼中的好解决方案。

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

【讨论】:

  • 在哪里可以添加标签?是标识符吗?
  • 对不起,我真的不知道从哪里开始。我还没有真正学习 Swift。你能提供一个示例代码sn-p吗?
  • 在界面生成器中,在按钮属性中......或者如果您有很多记录或只是使用表格视图,您也可以生成按钮运行时间。
  • @ThomasCharlesworth,如果你赶时间,我可以提供代码 sn-p。但我建议你尽力一次。
  • 无论如何都会在接下来的 5 分钟内向您发送 sn-p 以在 swift 3 中获取带有标签的按钮
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2010-12-19
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多