2017-06-08 7 views
0

現在、各TableViewセルにあるセグメント化されたコントロールのインデックス値を格納する辞書を使用しています。各セグメント化されたコントロールには、それが入っている行のインデックスパスに対応するタグがあります。ディクショナリのみ1つのキーと値を格納する/以前のキーと値を上書きする

辞書では、キーはセグメント化されたコントロールのタグ(またはセグメント化されたコントロールが入っている行のインデックスパス、あなたはしてください)、値はセグメント化されたコントロール自体のインデックスです(つまり、オプション0はインデックス0に対応し、オプション1はインデックス1に対応します)。そこに3行であり、最初のセグメント化されたコントロールがオプション0選択した場合

ので、辞書は次のようになり、第二には、コントロールがオプション1を選択したセグメント化、そして第三は、制御はオプション1を選択したセグメント化:

[0:0, 1:1, 2:1] 

しかし、これは私が得るものではありません。私が辞書を印刷するとき、その中の唯一の値は、今押されたボタンのキーとインデックスです。このような何か:

[0:0] 
[1:1] 
[2:1] 

私はそのために、セグメント化された制御1のオプション0、セグメント化されたコントロール2のオプション1、およびセグメント化された制御3のオプション1を選択した場合。ここ

は、参考のために自分のコードである:

import UIKit 

class MyTableViewController: UITableViewController { 

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 150 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 
    return 3 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) 


    let nameLabel: UILabel = { 
     let label = UILabel() 
     label.text = "Sample Item" 
     label.translatesAutoresizingMaskIntoConstraints = false 
     return label 
    }() 

    let actionButton = YSSegmentedControl(
     frame: CGRect.zero, 
     titles: [ 
      "Yes", 
      "No" 
     ]) 


actionButton.delegate = self 
cell.addSubview(nameLabel) 
cell.addSubview(actionButton) 
actionButton.translatesAutoresizingMaskIntoConstraints = false 

cell.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-160-[v1]-16-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel, "v1": actionButton])); 
cell.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel])) 
cell.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[v0]-60-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": actionButton])) 

actionButton.tag = indexPath.row 


    cell.backgroundColor = .green 
    return cell 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 



    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellId") 

    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

extension MyTableViewController: YSSegmentedControlDelegate { 
func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt  index: Int) { 
    var indexToTag = [Int:Int]() 
    indexToTag[index] = segmentedControl.tag 

    // Looking up tag 
    let tag = indexToTag[index] 

    print("\(indexToTag)") 

} 

func segmentedControl(_ segmentedControl: YSSegmentedControl, didPressItemAt index: Int) { 

} 

}

と同様に自分のアプリケーションの画像:

https://i.stack.imgur.com/ezMUJ.png

のおかげで、 ニック

答えて

0

改訂:あなたはコード例は、スコープ関数にローカルであるとしない変数、indexToTagを、使用する各

indexToTag[index] = segmentedControl.tag 

前に、新しい辞書を取得しているように私には見えます生き残ります。

辞書(indexToTag)を関数 の中から移動することはできますが、拡張子のままであれば、インスタンスのストアドプロパティを覚えている可能性があります。

迅速な拡張機能は、拡張機能に格納されたプロパティを直接許可しないという問題があります。 (格納されたプロパティとすばらしい拡張機能については、Stack Overflowのエントリをチェックしてください)。

難しいのは、辞書の内容を覚えておくために、コードに目的のクラスまたはインスタンス変数を持たせることです。

ここには、些細な拡張機能を使用したサンドボックスの例があります。辞書は拡張子の外にあります。

あなたのコードがどのようにして最も類似したものになるかわかりません。indexToTag辞書である

tag is 0 indexToTag contains: [0: 0] 
tag is 1 indexToTag contains: [0: 0, 1: 1] 
tag is 1 indexToTag contains: [2: 1, 0: 0, 1: 1] 

注印刷

import Foundation 

var indexToTag = [Int:Int]() 

extension String { 
    func control(index: Int, scTag: Int) { 
     indexToTag[index] = scTag 

     let tag = indexToTag[index]! 
     print(" tag is \(tag) indexToTag contains: \(indexToTag)") 
    } 
} 

let bst = String() 

bst.control(index: 0, scTag: 0) 
bst.control(index: 1, scTag: 1) 
bst.control(index: 2, scTag: 1) 

、従ってコンテンツは、挿入の元の順序を持​​っていません。

+0

これを修正するにはどうすればよいですか? –

+0

ありがとう、私は少しそれを考え直していた。機能の範囲が問題でした。私は拡張の外の辞書を宣言し、それはすばらしく働いた。あなたは本当に大きな助けとなりました。私はそれを働かせることができないと心配していました。 –

関連する問題