【问题标题】:swift accessing variable from another file从另一个文件快速访问变量
【发布时间】:2018-06-11 10:37:26
【问题描述】:

我是一个新手 swift 程序员,我被要求编写一个应用程序,让你输入一个单词,然后生成一个随机 Haiku 这是一个选项卡式应用程序,有两个 ViewController。 (诗)基于那个词。所以在 FirstViewController 中我有数据,我想在 SecondViewController 中以一种很好的方式显示这些数据。 我在 FirstViewController 中有所有的诗行,但我想在 SecondViewController 中访问这些变量。我尝试创建一个函数,它只返回它们,然后在 SecondViewController 中调用该函数,但没有任何结果,因为该函数只是返回 nil。如果你们中的任何人可以提供帮助,我会很高兴 谢谢!

这里是 FirstViewController:

import UIKit
import Foundation


class FirstViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var keyWordTextField: UITextField!

@IBOutlet weak var syllableSlider: UISlider!   
@IBOutlet weak var syllableSliderLabel: UILabel!
var syllableSliderValue = 1


@IBOutlet weak var lineOneTextField: UITextField!

@IBOutlet weak var lineTwoTextField: UITextField!
@IBOutlet weak var lineThreeTextField: UITextField!


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    lineOneTextField.text = "Rad 1"
    lineTwoTextField.text = "Rad 2"
    lineThreeTextField.text = "Rad 3"


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func syllableValueChanged(sender: UISlider) {
    syllableSliderValue = Int((sender.value))
    syllableSliderLabel.text = "Ordet har: \(syllableSliderValue) stavelser"
}


@IBAction func getNewHaiku() {
    if keyWordTextField.text != "" {
        let keyWord = keyWordTextField.text
        let lineOne = generateLine(keyWord: keyWord, syllables: syllableSliderValue,        lineSyllableLenght: 5)
        let lineTwo = generateLine(keyWord: keyWord, syllables: syllableSliderValue, lineSyllableLenght: 7)
        let lineThree = generateLine(keyWord: keyWord, syllables: syllableSliderValue,  lineSyllableLenght: 5)
        lineOneTextField.text! = lineOne
        lineTwoTextField.text! = lineTwo
        lineThreeTextField.text! = lineThree
    }

}
func generateLine(#keyWord: String, syllables : Int, lineSyllableLenght : Int) -> String {
    let oneSyllables = Dict().oneSyllables
    let twoSyllables = Dict().twoSyllables
    let threeSyllables = Dict().threeSyllables
    let fourSyllables = Dict().fourSyllables

    let randomOneSyllableWordNumber = Int(arc4random_uniform(UInt32(oneSyllables.count)))
    let randomTwoSyllableWordNumber = Int(arc4random_uniform(UInt32(twoSyllables.count)))
    let randomThreeSyllableWordNumber = Int(arc4random_uniform(UInt32(threeSyllables.count)))
    let randomFourSyllableWordNumber = Int(arc4random_uniform(UInt32(fourSyllables.count)))

    var lineArray : [String] = []
    var line = ""
    lineArray.append(keyWord)

    if syllables == 1 {
        let randomWordMethod = Int(arc4random_uniform(2))

        if randomWordMethod == 0 {

            lineArray.append(fourSyllables[randomFourSyllableWordNumber])

        } else if randomWordMethod == 1 {

            lineArray.append(threeSyllables[randomThreeSyllableWordNumber])
            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
        } else if randomWordMethod == 2 {

            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
            lineArray.append(twoSyllables[randomOneSyllableWordNumber])
            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
        }

    } else if syllables == 2 {
        let randomWordMethod = Int(arc4random_uniform(2))

        if randomWordMethod == 0 {

            lineArray.append(twoSyllables[randomOneSyllableWordNumber])
            lineArray.append(oneSyllables[randomTwoSyllableWordNumber])
        } else if randomWordMethod == 1 {

            lineArray.append(threeSyllables[randomThreeSyllableWordNumber])
        } else if randomWordMethod == 2 {
            lineArray.append(twoSyllables[randomTwoSyllableWordNumber])
            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
        }
    } else if syllables == 3 {
        let randomWordMethod = Int(arc4random_uniform(1))

        if randomWordMethod == 0 {
            lineArray.append(twoSyllables[randomTwoSyllableWordNumber])
        } else if randomWordMethod == 1 {
            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
        }

    } else if syllables == 4 {
        lineArray.append(oneSyllables[randomOneSyllableWordNumber])
    }

    if lineSyllableLenght == 7 {
        let randomWordMethod = Int(arc4random_uniform(1))

        if randomWordMethod == 0 {
            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
            lineArray.append(oneSyllables[randomOneSyllableWordNumber])
        } else if randomWordMethod == 1 {
            lineArray.append(twoSyllables[randomTwoSyllableWordNumber])
        }
    }
    for word in lineArray {
        line += " \(word)"
    }
    line += ","

    return line
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    self.view.endEditing(true)
}
func getData() -> (line2: String, line3: String) {

    return (lineTwoTextField.text, lineThreeTextField.text)

}


}

Ps,“Dict”是另一个文件,但只包含单词。

第二个视图控制器是空白的。

【问题讨论】:

  • “我尝试创建一个函数,除了返回它们之外什么都不做,然后在 SecondViewController 中调用该函数”——我们需要查看您尝试的此函数,以及您尝试调用的方式它来自第二个视图控制器。您发布的代码对解决您的问题没有用处。
  • func getData() -> (String, String, String) { return (lineOneTextField.text, lineTwoTextField.text, lineThreeTextField.text) }
  • 是的,您是如何尝试从您的第二个控制器调用它的?
  • 我在一个名为的函数中创建了第一个视图控制器的实例: override func viewDidAppear(animated: Bool) { let firstViewController = FirstViewController() let data = firstViewController.getData() lineOneLabel.text = data .line1 lineTwoLabel.text = data.line2 lineThreeLabel.text = data.line3 }
  • 让 firstViewController = FirstViewController() 创建一个新的 FirstViewController 实例,它不会获得对你已有实​​例的引用。

标签: ios xcode swift viewcontroller


【解决方案1】:

或者您可以将其设为全局变量,以便任何文件都可以访问它。

struct structname {
    static var yourvariable = value
}

调用时输入

filename.structname.yourvariable

【讨论】:

    【解决方案2】:

    您需要在第二个视图控制器中传递这样的实例:

    var firstViewController: FirstViewController?
    

    然后在两者都知道的主实例中:

    secondViewController.firstViewController = firstViewController
    

    (例如在 awakeFromNib 中)假设它们在主实例中是已知的,例如

    let firstViewController = FirstViewController()
    let secondViewController = SecondViewController()
    

    最后在 SecondViewController 中你可以访问第一个:

    firstViewController?.generateLine....
    

    【讨论】:

      猜你喜欢
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      相关资源
      最近更新 更多