【问题标题】:how to pass a button label after a segue in swift如何在 swift 中的 segue 后传递按钮标签
【发布时间】:2016-08-18 00:43:00
【问题描述】:

我想使用启动 segue 的按钮的标题作为出现的另一个按钮的标题。在第一个视图中,我创建了包含在名为 Table 的数组中的 4 个按钮。 然后在第二个视图中,我只有一个按钮,其标题将是触发 segue 的按钮的名称。这是我所做的快速概述

@IBOutlet var Table: [UIButton]!
@IBAction func commanderSegue(sender: AnyObject?) {

    performSegueWithIdentifier("commander", sender: nil)

    print("it works!") }
    override  func prepareForSegue(segue:UIStoryboardSegue, sender:AnyObject?){    
if segue.identifier == "commander" {

    print("we can order!")
        if let nextVC: OrderViewController = segue.destinationViewController as? OrderViewController {

          if let buttonTitle = sender as? UIButton.currentTitle {

            nextVC.tablex.titleLabel.text = buttonTitle

        print("Miam!")
             }  
        }
}

但它告诉我'当前标题不是 UIButton 的成员类型。我该如何解决?感谢任何可以提供帮助的人。

【问题讨论】:

    标签: ios swift uibutton segue


    【解决方案1】:

    按钮的标签是titleLabel:

    let button = sender as! UIButton
    if let buttonTitle = button.titleLabel!.text {
        nextVC.buttonText = buttonTitle // Assign the label text to a variable in the next viewController
    }
    

    在你的第二个 VC 中,你会想要:

    var buttonText: String!
    

    然后您可以将其分配给下一个 vc 的按钮标题:

    tablex.titleLabel.text = buttonText
    

    【讨论】:

    • 谢谢 我试过了,但没用。我在 let button = sender as 处收到此消息“致命错误:在展开可选值时意外发现 nil”(lldb)! UIbutton 语句。它发生是因为我们使用 !代替 ?在发件人中?好吧,我明天会继续尝试不同的解决方案。
    【解决方案2】:

    三件事:

    1. 您应该将UIButtonsender 一起传递给commanderSegue。您知道您的 @IBAction 已连接到一个按钮,因此将其类型更改为 UIButton 并在 performSegueWithIdentifier 调用中将 nil 替换为 sender

      performSegueWithIdentifier("commander", sender: sender)
      
    2. prepareForSegue 中,有条件地将sender 转换为UIButton,然后调用currentTitle

      if let buttonTitle = (sender as? UIButton)?.currentTitle {
      
    3. destinationViewController 中的@IBOutlets 未在prepareForSegue 时间设置。为了解决这个问题,将按钮的标题保存到destinationViewController 中名为buttonTitle 的属性中,然后将其分配给destinationViewController 中viewDidLoad 中的UILabel

      var buttonTitle = ""
      
      override func viewDidLoad() {
          super.viewDidLoad()
          tablex.titleLabel.text = buttonTitle
      }
      

    @IBOutlet var Table: [UIButton]!
    @IBAction func commanderSegue(sender: UIButton) {
    
        performSegueWithIdentifier("commander", sender: sender)
    
        print("it works!")
    }
    
    override func prepareForSegue(segue:UIStoryboardSegue, sender:AnyObject?) {    
        if segue.identifier == "commander" {
    
            print("we can order!")
            if let nextVC = segue.destinationViewController as? OrderViewController {
    
                if let buttonTitle = (sender as? UIButton)?.currentTitle {
    
                    nextVC.buttonTitle = buttonTitle
    
                    print("Miam!")
                }  
            }
        }
    }
    

    【讨论】:

    • 谢谢!!!我结合了你所说的和@Shades 的建议。正如你所说,问题是我的发件人是 nil 而不是指定 UIButton。但我必须明确声明 tablex.titleLabel.text = buttonTitle 不会更改文本。当我使用 tablex.setTitle(buttonTitle, forState: UIControlState.Normal) 时它起作用了。当然,我必须使用语句 var buttonTitle:String 将 buttonTitle 定义为字符串!在第二个VC。谢谢各位
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多