执行 segue 后,文本字段永久位于标签中

Posted

技术标签:

【中文标题】执行 segue 后,文本字段永久位于标签中【英文标题】:Text field is permanently in label after performing segue 【发布时间】:2018-11-20 10:12:55 【问题描述】:

我有一个具有 2 个按钮和 2 个文本字段的视图控制器,以及具有 1 个标签的第二个视图控制器。目前,如果我按下 buttonOne,第二个视图控制器中的标签将更改为“文本字段 1”,当我按下 buttonTwo 时,相同的标签再次显示“文本字段 1”。理想情况下,我希望标签在按下 buttonOne 时显示“文本字段”,在按下 buttonTwo 时显示“文本字段 1”。下面是使用的 2 个视图控制器以及我正在使用的情节提要和模拟器的屏幕截图。我认为问题出在secondController.myString = textField.text!,但我不知道如何解决它。任何帮助表示赞赏。

故事板

模拟器

第一个视图控制器:

import UIKit

class ViewController: UIViewController 

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var textField1: UITextField!

    var isButtonClicked: Bool = false

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)

        isButtonClicked = false
    

    @IBAction func buttonOne(_ sender: Any) 
        if textField.text != "" 
            isButtonClicked = true
            performSegue(withIdentifier: "segue", sender: self)
        

    

    @IBAction func buttonTwo(_ sender: Any) 

        if textField1.text != ""
            isButtonClicked = true
            performSegue(withIdentifier: "segue", sender: self)
        

    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        var secondController = segue.destination as! SecondViewController
        secondController.myString = textField.text!
        secondController.myString = textField1.text!
   

第二个视图控制器:

import UIKit

class SecondViewController: UIViewController 

    @IBOutlet weak var label: UILabel!

    var myString = String()


override func viewDidLoad() 
    super.viewDidLoad()

    label.text = myString

【问题讨论】:

【参考方案1】:

你错了

secondController.myString = textField.text!
secondController.myString = textField1.text!

每次仅将textField1.text 传递给myString,以便显示您的 textField1 值。

喜欢下面

var isFirstButtonClicked: Bool = false   

@IBAction func buttonOne(_ sender: Any) 
    if textField.text != "" 
        isFirstButtonClicked = true
        performSegue(withIdentifier: "segue", sender: self)
    


@IBAction func buttonTwo(_ sender: Any) 
    if textField1.text != "" 
        isFirstButtonClicked = false
        performSegue(withIdentifier: "segue", sender: self)
    


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    var secondController = segue.destination as! SecondViewController

    if isFirstButtonClicked 
        secondController.myString = textField.text!
    
    else 
        secondController.myString = textField1.text!
    

【讨论】:

当我尝试这样做时,当我单击 buttonTwo 时出现错误:以 NSException 类型的未捕获异常终止。我已经确定我正在使用所有的按钮和标签,并且它们都在代码中被引用,但它似乎不起作用。 buttonOne 工作正常。感谢您的帮助! @EdwardGallagher,使用上述代码不会出现异常。如果您以前的代码有效,那么此代码应该有效。确保您的按钮插座和操作成功绑定。 好吧,我要从头开始,以确保它有效!非常感谢! 刚刚重新开始,它的工作原理!非常感谢! @EdwardGallagher,太好了。【参考方案2】:

这是因为您只设置了 textField1 的文本。您可能想要的是在第二个 ViewController 中设置 myString 取决于用户按下了哪个按钮。

在情节提要中,将第一个按钮的 tag 设置为 1,将第二个按钮设置为 2 然后在准备继续使用这个

let button = sender as! UIButton
if button.tag == 1 
    secondController.myString = textField.text!
 else 
    secondController.myString = textField1.text!

也不要忘记执行 segue 并将 sender 作为此 perform segue 方法的 sender 参数传递

performSegue(withIdentifier: "segue", sender: sender)

【讨论】:

感谢您的帮助!我最终使用了 Kuldeeps 代码,但感谢您投入的时间!

以上是关于执行 segue 后,文本字段永久位于标签中的主要内容,如果未能解决你的问题,请参考以下文章

如何从标签栏控制器执行 show segue?

关闭模态视图控制器,然后执行 segue

IOS从标签栏项目执行segue

如何快速执行条件segue操作?

从未打开的 ViewController 执行 Segue

Firebase 下载/上传完成后进行 Segue