准备segue时如何访问变量?

时间:2018-04-17 08:35:45

标签: ios swift swift4 uistoryboardsegue

我正在为Segue做准备(此刻只是学习!)并希望通过segue传递一个在函数中创建的数组,以便到达新的视图控制器。

如果我只是在其中放置一个文本字符串,它工作正常,但是当我尝试更改为数组时它是空白的 - 我认为因为它无法访问数组,因为它是超出范围 - 但我仍然坚持如何做到

这是最初的VC代码:

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


    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController {
            destVC.workoutName = (testArray)

    }
    }
     //Get the new view controller using segue.destinationViewController.
     //Pass the selected object to the new view controller.
}

func testfunction() {
    let testArray = ["blah","blah","ploop"]
} 

和接收VC代码'

class WorkoutViewController: UIViewController {


var workoutName = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    print(workoutName)

    // Do any additional setup after loading the view.
}

我几乎就在那里,但我想我必须遗漏一些基本的东西。你如何传递函数中创建的数组/其他变量?

如果函数有多于1个变量/数组,那会改变方法吗?即一个函数可能会产生锻炼中的练习和代表的数量,例如

5 个答案:

答案 0 :(得分:1)

您可以发件人

发送
 self.performSegue(withIdentifier: "goToWorkout ", sender: testArray)

并在

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

   if segue.identifier == "goToWorkout" {
       if let destVC = segue.destination as? WorkoutViewController {
          destVC.workoutName = sender as! [String]

   }
}

答案 1 :(得分:0)

func testfunction() -> [String] {
    return ["blah","blah","ploop"]
}

我想这就是你想要的。函数/方法可以返回值。它可以通过->语法来实现。

现在您可以使用:

destVC.workoutName = testfunction()

几点注释

函数,方法和变量应该通过驼峰案例表示法命名。因此,您应该写testfunction而不是testFunction(或许也可以选择更好的名称)。

不要忘记阅读有关该主题的Apple文档:Functions

答案 2 :(得分:0)

是的,两个testArray的出现都不在同一范围内,编译器会抱怨。

以这种方式声明函数

func testfunction() -> [String] {
    let testArray = ["blah","blah","ploop"]
    return testArray
} 

并通过调用函数

来分配数组
destVC.workoutName = testfunction()

答案 3 :(得分:0)

您的问题是由testArray作为testfunction函数内定义的局部变量引起的,只能从函数内部访问。如果你想让一个变量可以从类中的任何地方访问,你必须使它成为一个实例属性。

class InitialVC: UIViewController {
    let testArray = ["blah","blah","ploop"]

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToWorkout" {
            if let destVC = segue.destination as? WorkoutViewController {
                destVC.workoutName = testArray

            }
        }
        //Get the new view controller using segue.destinationViewController.
        //Pass the selected object to the new view controller.
    }
}

答案 4 :(得分:0)

说:

destVC.workoutName = (testArray)

prepare(for segue: UIStoryboardSegue, sender: Any?)方法中,肯定不引用testArray中的testfunction()变量,因为它是一个局部变量。如果您没有在上面的行中收到编译时错误,那么可能是您在视图控制器中的某个地方声明testArray,或者可能是应用程序中的全局声明。

所以你可以做的是将testfunction()声明为testfunction() -> [String]

func testfunction() -> [String] {
    return["blah","blah","ploop"]
}

因此:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController {
            destVC.workoutName = testfunction()
        }
    }
}