2017-02-23 30 views
1

複数のボタンがあります。各ボタンには言語ラベルが含まれています。Swift3イベントをトリガーする複数のボタンの動的コーディング

ユーザーがボタンをタップすると、選択した言語ラベルがタップされたボタンの値に応じて変更されます。

選択された言語アウトレットはSelectedLangTextと呼ばれます。

単純な解決策は、ボタンごとに複数のアクションアウトレットを作成し、SelectedLangTextラベルの値を設定することです。しかし、100個のボタンがあると、それは不正なコーディングになります。

Web開発から来たSwift 3のこの状況にどう接近するのかよく分かりません。

enter image description here

+0

静的コンテンツの代わりに動的コンテンツを使用してtableViewを作成してください。そうすれば、無限の量の言語をサポートすることができます。アドバイスの単語は、iOSで変数名とメソッドをタイプするときに、より低いラクダケースを使用します。私は秒で答えを書くでしょう。私はあなたがUITableViewDataSourceを操作する方法を知っており、カスタムセルを作成する方法を知っているという前提で取り組んでいます – DatForis

答えて

1

は、私はそれが

1-作成@IBActionsの単なる質量量よりもはるかにきれいなアプローチであることがわかりました語学クラス 輸入財団

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

幸運

にデリゲートの実装を追加するために、その後、あなたは委任プロトコルを作成します
+0

これは非常に小さなタスクのための極端な過度のようです。私は本当にこのたくさんのコードが必要ですか? –

+0

これは、たくさんの細胞が必要な場合にこれを行う正しい方法です。また、コードを読んでいる人にとってはより良いことです。それは、よりエレガントで明確なカットアプローチを提供します。 – DatForis

-1

あなたは各ボタンにタグを追加して、すべてのボタンに同じIBActionを設定することができます。

まず、ボタンに基づいて言語を取得します。 ループを使用して(それぞれのボタンに適切なインデックスが必要なので、forループに行ってください)、タグからすべてのボタンを取得して言語タグを設定します。

少し複雑ですが、あなたの問題と私の目の良い解決策を解決します。私は、それはそれのためにそのような問題を解決することになると、デリゲートのデザインパターンを使用して好む

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

どこにタグを追加できますか?それは識別子ですか? –

+0

申し訳ありません私はどこから始めるべきか本当に固執しています。私は実際にスウィフトをまだ学んでいない。サンプルのコードスニペットを提供できますか? –

+0

インターフェイスビルダでIn buttonsプロパティ....またはレコードが多い場合やテーブルビューを表示する場合にも実行時間のボタンを生成できます。 –

関連する問題