Swift - PrepareForSegue 无法传递 sender.tag(其他 ViewController 标签中的值为零)

Posted

技术标签:

【中文标题】Swift - PrepareForSegue 无法传递 sender.tag(其他 ViewController 标签中的值为零)【英文标题】:Swift - PrepareForSegue fails to pass sender.tag (nil value in other ViewController Label) 【发布时间】:2015-02-15 09:15:36 【问题描述】:

我尝试以编程方式创建大量按钮,然后当我单击每个按钮时,它会显示另一个 ViewController 标签中按钮标记的值。

我创建按钮的代码:

for index in 0..<ID.count 
        let button = UIButton.buttonWithType(UIButtonType.System) as UIButton
        button.tag = ID[index]
        button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)

我的按钮动作功能:

func buttonAction(sender:UIButton!)

    self.performSegueWithIdentifier("segueIdentifier", sender: self)

我的 prepareForSegue 函数:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 
    if (segue.identifier == "segueIdentifier") 
        var svc = segue.destinationViewController as NextViewController;

        var tag = sender.tag
        svc.toPass = "\(tag)"
    

我在 NextViewController 中的代码:

    var toPass: String!

@IBOutlet var testLabel: UILabel!
override func viewDidLoad() 
    super.viewDidLoad()

    testLabel.text = toPass

我已经通过 push segue 链接了两个 ViewController。但是,当我单击按钮时,NextViewController 中的标签显示“nil”。 如果我将 svc.toPass = "(tag)" 更改为 svc.toPass = "something",标签将显示“something”。可能 prepareForSegue 函数中的发送方存在一些问题。请帮忙。谢谢。

【问题讨论】:

【参考方案1】:

是的,它与 sender 参数有关。在按钮触摸处理程序中:

func buttonAction(sender:UIButton!)

    self.performSegueWithIdentifier("segueIdentifier", sender: self)

您正在执行转场,将self 作为发送者传递,即视图控制器实例。在prepareForSegue 中,您正在读取发送者的标签属性,即视图控制器的标签。

我认为您可以通过将按钮实例作为发件人传递来解决此问题:

func buttonAction(sender:UIButton!)

    self.performSegueWithIdentifier("segueIdentifier", sender: sender)
    //                                                         ^^^^^^

【讨论】:

以上是关于Swift - PrepareForSegue 无法传递 sender.tag(其他 ViewController 标签中的值为零)的主要内容,如果未能解决你的问题,请参考以下文章

prepareForSegue 不适用于自定义 segue (swift)

Swift:prepareForSegue 有两个不同的 segue

Swift:PrepareForSegue 正在运行但未加载 ViewController

在 Swift 2 中通过“prepareForSegue”传递数据

(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil

Swift:prepareForSegue 和 instantiateViewController 之间的区别