swiftでsegueの遷移時の処理で分からないので分かる方教えて下さい。

segueをIBを使うのではなくidentifierを設定してプログラムで使います。
2つの画面ViewControllerとPuzzleViewControllerがありperformSegueWithIdentifierを使って遷移させます。遷移方法は画像を作成してそちらからonClickButtonのアクションで移動します。TouchUpInsideする画像によって次の画面でのアクションが異なるため画像を設置した際にtag(cTag)を設定します。そこで質問ですがprepareFoSegueメソッド内にsender?.tagを設定したのですがなぜかnilが返ってきます。onClickButtonメソッド内でsender?.tagを設定するとちゃんとしたタグの数値が返ってくるのですがprepareFoSegueメソッドが発生した時点で参照範囲外になってしまうからでしょうか?またどういった考え方をすればいいでしょうか?

func cImageMake(cImageName:String,cTag:Int,cWideth:CGFloat,cHeight:CGFloat,cText:String){
    //アイコン画像の生成
    let cImage:UIImage = UIImage(named: cImageName) as UIImage!
    let cImageButton = UIButton()
    cImageButton.tag = cTag
    cImageButton.frame = CGRectMake(0, 0, 75, 75)
    cImageButton.layer.position = CGPoint(x: self.view.frame.width/4 * cWideth , y: self.view.frame.height/4 * cHeight)
    cImageButton.setImage(cImage, forState: .Normal)
    cImageButton.addTarget(self, action: "onClickCButton:", forControlEvents: .TouchUpInside)
    self.view.addSubview(cImageButton)
    //アイコン文字の生成
    var cTextField:UITextField = UITextField(frame: CGRectMake(0, 0, 75, 75))
    cTextField.text = cText
    cTextField.textAlignment = NSTextAlignment.Center
    cTextField.enabled = false
    cTextField.layer.position = CGPoint(x: self.view.frame.width/4 * cWideth, y: self.view.frame.height/4 * cHeight )
    self.view.addSubview(cTextField)
}

//ボタンイベントPuzzleViewControllerを表示
func onClickCButton(sender: AnyObject){
    self.performSegueWithIdentifier("goPuzzleSegue", sender: sender.tag)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "goPuzzleSegue"{
        let puzzleViewController:PuzzleViewController = segue.destinationViewController as! PuzzleViewController
        puzzleViewController.castleId = sender?.tag