Ios swift-通过Segue返回并传递多个数组和一个Int
我正在写一个小的基本程序(仍在学习),但我遇到了一个障碍 我现在可以在两个视图控制器之间传递一个数组,并在第二个视图控制器中按下按钮时成功打印它 然而,我真正想做的是传递2个数组和一个整数,它们是从第一个VC上的函数创建的,并通过第二个VC访问它们 第一个VC的代码如下:Ios swift-通过Segue返回并传递多个数组和一个Int,ios,swift,swift4,Ios,Swift,Swift4,我正在写一个小的基本程序(仍在学习),但我遇到了一个障碍 我现在可以在两个视图控制器之间传递一个数组,并在第二个视图控制器中按下按钮时成功打印它 然而,我真正想做的是传递2个数组和一个整数,它们是从第一个VC上的函数创建的,并通过第二个VC访问它们 第一个VC的代码如下: override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "goToWorkout" {
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),但没有成功
非常感谢任何帮助 您可以简单地使用
元组
在单个变量中包含多个不同类型的变量。您应该将包含performsgue
函数中所有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
的返回值分配给performsgue
的发送方输入参数:
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
}
}
}
正如其他人所建议的,您可以重构函数以返回元组,然后使用该元组传递给其他视图控制器:
//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()
}
}
}
您应该可以将元组(array1、array2、int)不使用func赋值,而是直接在prepare(…)中为每个属性分别赋值。DestVC.randomArray1=randomArray1,依此类推on@nc14您不能在注释中放换行符,因此您的注释中缺少实际的错误消息对不起,现在应该在那里了@nc14更新了我的答案,这将修复第一个错误。对于第二个错误,正如我在回答中已经指出的,您应该声明所有3个变量,使它们可以从调用
performsgue
Yes perfect的范围访问-这修复了第一个错误,我看到您在那里做了什么。关于第二点,我尝试在performsgue上方的“goPressed”函数中调用“testFunction”,但这不起作用-如果需要使用函数生成变量,如何使用您的方法?(很抱歉,这可能真的很容易!)@nc14检查我的更新答案,我已将其修改为使用testFunction
生成变量hanks-您能否详细说明“重构workoutviewcontroller”部分?我试着设置一个属性,比如“parameters=([String]),[String],Int()”,但是上面说“不能调用函数类型any的值”和“不能在没有参数的情况下调用”