2017-05-03 15 views
0

Firebaseデータに基づいて動的なラジオボタンを作成しようとしています。私は、垂直スタック内のボタンを配置することを望んでいますし、彼らがクリックされたとき、基本的に私は彼らが消えるのを願っていますし、別のビューを表示します:あなたはSWIFT 3.0を使用している場合Swift 3 - .addTarget()メソッドがトリガしないSelector

class PollController: UIViewController { 

@IBOutlet weak var passLabel: UILabel! 
@IBOutlet weak var pollImage: UIImageView! 
var ref: FIRDatabaseReference! 
var pollRef: FIRDatabaseReference! 

var pass = "" 
var passedImageURL = "" 

var posX = 0; 
var posY = 0; 

var buttons = [UIButton]() 


override func viewDidLoad() { 
    super.viewDidLoad() 
    ref = FIRDatabase.database().reference() 
    pollRef = ref.child("Polls").child(pass) 
    passLabel.text = pass 
    pollImage.sd_setImage(with: URL(string: passedImageURL), placeholderImage: UIImage(named: "test")) 


    pollRef.observe(FIRDataEventType.value, with: {(snapshot) in 
    let numberOfChildren = snapshot.childSnapshot(forPath: "answers").childrenCount 
    self.passLabel.text = String(numberOfChildren) 
    print(numberOfChildren) 

    var stackView = UIStackView(arrangedSubviews: self.buttons) 

     // create button1 
    for x in 0..<numberOfChildren { 
      let button = UIButton(frame: CGRect(x: self.posX, y: self.posY, width: 60, height: 20)) 
      button.setTitleColor(UIColor.black, for: .normal) 
      button.setTitle("No", for: .normal) 
      button.setImage(UIImage(named: "checkbox untick.png")!, for: .normal) 
      // if the selected button cannot be reclick again, you can use .Disabled state 
      button.setImage(UIImage(named: "checkboxredtick.png")!, for: .selected) 
      button.tag = Int(x) 
      button.addTarget(self, action: #selector(self.buttonAction(sender:)), for: .touchUpInside) 

      stackView.addSubview(button) 
      self.buttons.append(button) 
      // create other buttons and add into buttons ... 
     } 
     }) 
    // Do any additional setup after loading the view. 
} 


func buttonAction(sender: UIButton!){ 
    for button in buttons { 
     button.isSelected = false 
    } 
    sender.isSelected = true 
    // you may need to know which button to trigger some action 
    // let buttonIndex = buttons.indexOf(sender) 
} 


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

enter image description here

答えて

3

セレクタパラメータに_:がないため、以下のような追加ターゲットメソッドを定義する必要があります。

button.addTarget(self, action: #selector(buttonAction(_:)), for: .TouchUpInside) 

もチェックし、あなたが持っているIDは、ここではmyStackview変数を宣言します。あなたのボタンの宣言がfunc buttonAction(sender: UIButton!)ある

self.myStackview 
+0

の途中で、まだ#selectorとメソッドに問題があります。 swift/iOSの新機能で、コンセプトを完全に理解していない – tccpg288

+0

ohh ...あなたの中括弧内に** buttonAction **機能が宣言されているようです。関数をそのコードの外に移動してください。私はあなたが** didReceiveMemoryWarning **メソッドを見つけるのと同じ階層を意味します。 –

+0

ボタン配列も同様に移動する必要がありますか? – tccpg288

1

:あなたが宣言したならば、としてそれを追加しよう。 senderの前にアンダースコアがないことに注意してください。これは、関数を呼び出すときに引数の名前を指定する必要があることを意味します。あなたはまた、関数内で引数名の前にアンダースコアを追加することができますsender

button.addTarget(self, action: #selector(buttonAction(sender:)), for: .touchUpInside) 

引数名をセレクタにアンダースコアを交換してください。

func buttonAction(_ sender: UIButton!) 

また、コードがSwift 3の構文の大部分を認識していることに気付きました。だから、スウィフト3でタッチアップするためのコントロールイベントは、で、TouchUpInside

+0

Swiftには新しくありがたいことですが、Swift 3には多くの変更が組み込まれているように思えます。特に構文に関連しています – tccpg288

関連する問題