【问题标题】:Send a string from a viewController to another one将字符串从 viewController 发送到另一个
【发布时间】:2016-12-15 16:44:58
【问题描述】:

请在您将此问题标记为重复之前,我想知道为什么我的代码失败了,而不是发送给另一个正在运行的代码。

我是 swift 的新手,我想在单击同一个按钮时从 viewController 发送一个变量“um_words”(单击按钮时计算),将该变量保存在 secondViewController 中并显示在一个文本视图。为此,我尝试了对这段代码的许多修改,这在控制台中没有给出错误,但没有在 textView 上显示变量的值:

第一个 VC

import UIKit
import Foundation

class TransViewController: UIViewController {

@IBOutlet var trad_text: UITextView!
@IBOutlet var buttonTrad: UIButton!
@IBOutlet var labelsitoh: UILabel!

var num_words = 0

@IBAction func butCalc(_ sender: UIButton) {

    let text = trad_text.text

    num_words =  (text?.components(separatedBy: " ").count)!-1

     func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        var DestViewController : PaymentViewController = segue.destination as! PaymentViewController

        DestViewController.num_words =  String(num_words)
    }

}


override func viewDidLoad() {
    super.viewDidLoad()

    trad_text!.layer.borderWidth = 1
    trad_text!.layer.cornerRadius = 20
    trad_text!.layer.borderColor = UIColor(red:0.22, green:0.26, blue:0.39, alpha:1.0).cgColor
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

}

第二个 VC

import UIKit
import Foundation

class PaymentViewController: UIViewController {

@IBOutlet var labelImport: UITextView!

var num_words = String()

override func viewDidLoad() {
    super.viewDidLoad()

    labelImport.text = num_words

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

我有一个关于它为什么不起作用的假设:函数“prepare”没有被调用;仅在单击按钮时才会转到下一个 VC...

感谢您的宝贵时间。

【问题讨论】:

  • 在 prepareForSegue 中看不到任何内容。阅读(在这里和任何地方)这是如何完成的。请做好自己的功课。
  • 您的准备​​函数在另一个函数中,这就是它没有被调用的原因。
  • 我的函数位于单击按钮时应调用的函数内。如果我这样做它不起作用?

标签: ios swift uiviewcontroller viewcontroller


【解决方案1】:

func prepare 应该在按钮动作之外,它会在 segue 被触发时被调用。

@IBAction func butCalc(_ sender: UIButton) {

    let text = trad_text.text

    num_words =  (text?.components(separatedBy: " ").count)!-1

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    var DestViewController : PaymentViewController = segue.destination as! PaymentViewController

    DestViewController.num_words =  String(num_words)

}

【讨论】:

  • 问题是我必须使用同一个按钮来完成这两个功能。我需要先做基金butCalc 然后准备,你编码的方式,它只会做准备,不是吗?
  • 感谢您的帮助。您的答案显示变量“0”的值。它必须是我创建的全局变量,但如果我删除它,则会出现错误“使用未解析的标识符“num_words””
  • 您是否将按钮中的 segue 添加到情节提要中的第二个 VC 中?
  • 是的,我做了,但问题是相信全局变量 num_words 没有被修改
  • 你在启动 segue 之前检查了你的 var 吗?
【解决方案2】:

见:

IBAction func butCalc(_ sender: UIButton) {
    let text = trad_text.text
    num_words =  (text?.components(separatedBy: " ").count)!-1
    self.performSegue(withIdentifier: "yourSegueIdentifier", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "yourSegueIdentifier") {
        var destViewController : PaymentViewController = segue.destination as! PaymentViewController
        destViewController.num_words =  String(num_words)
    }
}

你已经在另一个函数中创建了一个函数... 请试试这个。

PS:我没有测试这段代码

【讨论】:

  • 感谢您的帮助。我已经尝试过你的代码,对我来说这似乎是正确的,但第二个 viewController 在屏幕上没有显示任何内容
  • 这是另一个你没有提到的问题!如果它解决了您的问题,则标记为解决方案!很高兴为您提供帮助
  • 好吧,我的意思是 textView 没有显示变量的值
  • 您能否在您的 viewDidLoad 方法中添加一个 print(num_words),以确保您通过了您的 var
  • 我做到了,它在控制台中没有打印任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2016-08-03
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
相关资源
最近更新 更多