【问题标题】:swift - return and pass multiple arrays and an Int via Segueswift - 通过 Segue 返回并传递多个数组和一个 Int
【发布时间】:2018-09-27 16:57:58
【问题描述】:

我正在编写一个小型基本程序(仍在学习),但我遇到了障碍。

我现在可以在 2 个视图控制器之间传递 1 个数组,并在我点击第二个按钮时成功打印它。

但是,我真正想做的是传递 2 个数组和一个整数,它们是从第一个 VC 上的函数创建的,并通过第二个 VC 访问它们。

第一个 VC 的代码在这里:

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

    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController {
            destVC.bothArrays = self.testFunction()
        }
    }
    //Get the new view controller using segue.destinationViewController.
    //Pass the selected object to the new view controller.
}

func testFunction() -> [String] {
    let randomArray1 = ["blah","blah","ploop"]
    let randomArray2 = ["alan", "john"]
    let randomInt = 5
    return BOTH ARRAYS AND INT TO SEND TO THE NEXT VIEW CONTROLLER?
}

@IBAction func goPressed(_ sender: UIButton) {
    performSegue(withIdentifier: "goToNextVC", sender: self)
}

这里是第二个 VC:

class WorkoutViewController: UIViewController {

    var randomArray1 = [String]()
    var randomArray2 = [String]()
    var randomInt = 0

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

    @IBAction func nowButtonPressed(_ sender: UIButton) {
        print(randomArray1)
        print(randomArray2)
        print(randomInt)
    }
}

我可以让它只使用一个数组,但我需要多个数组和一个要传递的值!我已经尝试过使用它(例如尝试'-> [String],[String],Int)但没有运气

非常感谢任何帮助!

【问题讨论】:

  • 你应该可以使用元组,(array1,array2,int)
  • 不要使用 func 来分配,而是直接在 prepare(...) 中分别为每个属性分配。 DestVC.randomArray1 = randomArray1 等等

标签: ios swift swift4


【解决方案1】:

您可以简单地使用tuple 将多个不同类型的变量包含在一个变量中。您应该将包含 performSegue 函数中所有 3 个变量的元组作为 sender 参数传递,然后将它们分配给 prepare(for:) 方法中的相关实例属性。

如果要保留生成变量的函数,则应将函数的返回类型更改为可以容纳 3 个变量的元组。

func testFunction() -> (arr1:[String],arr2:[String],randInt:Int) {
    let randomArray1 = ["blah","blah","ploop"]
    let randomArray2 = ["alan", "john"]
    let randomInt = 5
    return (randomArray1, randomArray2, randomInt)
}

然后将testFunction的返回值赋给performSegue的sender输入参数:

performSegue(withIdentifier: "goToNextVC", sender: testFunction())

分配变量:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController, let variablesToBePassed = sender as? (arr1:[String],arr2:[String],randInt:Int) {
            destVC.randomArray1 = variablesToBePassed.arr1
            destVC.randomArray2 = variablesToBePassed.arr2
            destVC.randomInt = variablesToBePassed.randInt
        }
    }
}

【讨论】:

  • @nc14 您不能在 cmets 中放置换行符,因此您的评论中缺少实际的错误消息
  • 抱歉现在应该到了!
  • @nc14 更新了我的答案,应该可以解决第一个错误。对于我在回答中已经说明的第二个错误,您应该声明所有 3 个变量,以便它们可以从您调用的范围内访问 performSegue
  • 是的,完美 - 修复了第一个错误,我知道你在那里做了什么。关于第二点,我尝试在 performSegue 上方的“goPressed”函数中调用“testFunction”,但这不起作用 - 如果您需要使用函数来生成变量,您将如何使用您的方法? (对不起,这可能真的很容易!)
  • @nc14 检查我更新的答案,我已将其修改为使用 testFunction 生成变量
【解决方案2】:

正如其他人所建议的,您可以重构您的函数以返回一个元组,然后使用它传递给您的其他视图控制器:

//This is the tuple data type we use to pass 2 string arrays and an Int
typealias  parameterTuple = ([String], [String], Int)


func testFunction() -> parameterTuple {
    let randomArray1 = ["blah","blah","ploop"]
    let randomArray2 = ["alan", "john"]
    let randomInt = 5
    return (randomArray1, randomArray2, randomInt)
}


func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController {
            //refactor WorkoutViewController to have a parameters property 
            //of type parameterTuple, split out the tuple and pass each part to
            //a different property in your WorkoutViewController
            destVC.parameters = testFunction()
        }
    }
}

【讨论】:

  • 谢谢 - 你能详细说明“重构锻炼视图控制器”部分吗?我试图设置一个像这样的属性“parameters = ([String]), [String], Int) () 但它说“不能调用任何函数类型的值”和“不能在没有参数的情况下调用”
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多