Swift3 多按钮动态编码触发事件
Swift3 Multiple buttons dynamic coding to trigger event
我有多个按钮。每个按钮都包含一个语言标签。
我想做的是,当用户点击按钮时,所选语言标签会根据点击的按钮更改其值。
选定的语言出口名为 SelectedLangText。
一个简单的解决方案是为每个按钮创建多个 Action 出口并设置 SelectedLangText 标签的值。但是,如果有 100 个按钮,那将是糟糕的编码。
我不确定如何处理来自 Web 开发的 Swift 3 中的这种情况。
您可以为每个按钮添加标签并为所有按钮设置相同的 IBAction。
首先在您的方法中获取基于按钮的语言。
现在使用循环(使用 for 循环,因为每个按钮都需要适当的索引)并从其标签中获取所有按钮并设置语言标签。
乍一看有点复杂,但会解决你的问题,而且是我眼中的好方案。
for index in 101...103 {
let myBtn = self.view.viewWithTag(index) as! UIButton
myBtn.setTitle("localisedtitle string", for: .normal)
}
在解决这样的问题时,我更喜欢使用委托设计模式,因为我发现它比大量的@IBActions 更简洁
1- 创建语言 class
进口基金会
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中添加delegate的实现class
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
}
}
祝你好运
我有多个按钮。每个按钮都包含一个语言标签。
我想做的是,当用户点击按钮时,所选语言标签会根据点击的按钮更改其值。
选定的语言出口名为 SelectedLangText。
一个简单的解决方案是为每个按钮创建多个 Action 出口并设置 SelectedLangText 标签的值。但是,如果有 100 个按钮,那将是糟糕的编码。
我不确定如何处理来自 Web 开发的 Swift 3 中的这种情况。
您可以为每个按钮添加标签并为所有按钮设置相同的 IBAction。
首先在您的方法中获取基于按钮的语言。 现在使用循环(使用 for 循环,因为每个按钮都需要适当的索引)并从其标签中获取所有按钮并设置语言标签。
乍一看有点复杂,但会解决你的问题,而且是我眼中的好方案。
for index in 101...103 {
let myBtn = self.view.viewWithTag(index) as! UIButton
myBtn.setTitle("localisedtitle string", for: .normal)
}
在解决这样的问题时,我更喜欢使用委托设计模式,因为我发现它比大量的@IBActions 更简洁
1- 创建语言 class 进口基金会
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中添加delegate的实现class
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
}
}
祝你好运