在Swift中,如何在视图控制器之间传递数据?

27

我正在尝试将一个Objective-C app转换成Swift,但我找不到使用Swift在视图之间传递数据的方法。我的Objective-C代码如下:

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
AnsViewController *ansViewController;
ansViewController = [storyBoard instantiateViewControllerWithIdentifier:@"ansView"];
ansViewController.num = theNum;
[self presentViewController:ansViewController animated:YES completion:nil];

这实际上是将变量theNum传递到不同视图控制器的变量num中。我知道这可能是一个简单的问题,但我对Swift感到非常困惑,如果有人可以解释一下他们如何将它改成Swift,那将不胜感激!

谢谢


2
在Swift中完全一样,您到底不确定什么? - Jack
一般来说,只是Swift语法的问题。我知道在Swift中不能使用方括号,但在电子书中,有时会使用点号或括号,我不确定在这里应该使用哪一个。 - lagoon
点号和括号语法是几乎在每种编程语言中都能找到的通用编程语法。简单来说,() 用于调用函数,. 用于访问类/结构体等的成员/属性/函数。 - Jack
谢谢,我现在已经基本弄清楚了,除了ansViewController.num = theNum这一部分,因为它说UIViewController没有名为theNum的成员。 - lagoon
这是一个基本示例:https://dev59.com/tGIj5IYBdhLWcg3wq2xz#31934101 - Suragch
1
@lagoon,您介意接受其中一个答案吗? - fulvio
7个回答

37

假设我们站在 firstView,想要从 DetailView 传递数据。如果要使用 Storyboard 来完成这个任务,在 firstView 中我们需要一个方法:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "segueTest") {
      //Checking identifier is crucial as there might be multiple
      // segues attached to same view
      var detailVC = segue!.destinationViewController as DetailViewController;
      detailVC.toPass = textField.text
    }
}

然后进入 DetailView 的类中,我们声明了一个变量:

var toPass: String!

然后你可以使用变量toPass(当然,您可以根据需要更改变量的类型,在此示例中,我仅对字符串类型进行演示)。


1
这看起来就是我需要的。我想要从VC 1传递一个变量数组到VC 2。然后,在VC 2中,用户将输入更多字段的信息。该信息将附加到数组中。完成后,将把数组发送到云端。我将您的代码复制到我的项目中并替换了我的变量名称。我收到了一个错误:“DispScreenOne没有名为'toPass'的成员。”{if (segue.identifier == "goToDispenseScreenTwo") { var DispScreenOne = segue.destinationViewController as! DispenseScreenTwoViewController; DispScreenOne.toPass = enteredDataArray.text } - Greg
1
@Greg:请确保在DispenseScreenTwoViewController中,你有一个名为toPass的变量。 - lee
@Lee:我有一个全局变量toPass。当我尝试在任何一个视图控制器中设置toPass的值时,它都能识别到这个变量。我错过了什么? - Greg
你有一个全局变量toPass要传到你的项目中,并不意味着DispenseScreenTwoViewController拥有这个变量。因此你会得到错误提示:**'DispScreenOne没有名为'toPass'的成员。** - lee
DispScreenOne.toPass的含义是:在DispenseScreenTwoViewController中,您必须有一个名为toPass的变量名称。 - lee
显示剩余2条评论

19
class AnsViewController: UIViewController {
   var theNum: Int

    override func viewDidLoad() {
        super.viewDidLoad()

        println(theNum)
    }

}

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    let viewController = self.storyboard.instantiateViewControllerWithIdentifier("ansView") as AnsViewController
    viewController.num = theNum
    self.presentViewController(viewController, animated: true, completion: nil)
}

在哪里设置视图控制器的标识符? - Zain Ullah Muhammad
@zainullah 在Storyboard ID中。 - fulvio

2

如何在Swift中从一个控制器传递字符串或其他数据到另一个控制器。

按照以下步骤:

1)在子控制器中创建属性:var abc: String!

2)创建子控制器的对象

let storyboard:UIStoryboard()
let viewController: childcontroller = storyboard.instantiateViewControllerWithIdentifier("childcontroller") as! childcontroller
viewController.abc = "hello";
self.navigationController.pushviewController(Controller:viewController animated:true CompletionHandler:nil)

0

在 Swift 中从一个控制器传递字符串或任何数据到另一个控制器的步骤如下:

1)创建所需类型的变量,例如(String、Int) var test : String!

2)创建子控制器对象

 let vc = self.storyboard?.instantiateViewController(withIdentifier: "Here identifier of your VC") as! (Here Name Of Your Controller)
 vc.test = "Hello" (Or any data which you want to pass)
 self.navigationController?.pushViewController(VC, animated: true)

那应该解决你的问题


0
Using tableview,

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
        {
            let ClubProfileView = self.storyboard?.instantiateViewController(withIdentifier: "CBClubProfileViewController") as! CBClubProfileViewController

            let TempCulubDic:NSDictionary =
                ((ClubsListbyDateDic.object(forKey:((ClubsListbyDateDic.allKeys as! [String]).sorted(by: <)as NSArray).object(at: indexPath.section) as! String) as! NSArray).object(at: indexPath.row))as! NSDictionary

            let ClubId:String=(TempCulubDic.value(forKey: "club_id") as? String)!

            let CheckIndate:String=(TempCulubDic.value(forKey: "chekin_date") as? String)!

            ClubProfileView.ClubID=ClubId

            ClubProfileView.CheckInDate = CheckIndate

            // self.tabBarController?.tabBar.isHidden=true

            ClubProfileView.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(ClubProfileView, animated: true)
            }

0
     @IBAction func nextbtnpreesd(_ sender: Any) {

            let mystring = "2"
            performSegue(withIdentifier: "MusicVC", sender: mystring)
        }



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


        if let destination = segue.destination as? MusicVC{

            if let song = sender as? String{
                destination.strlablevalie = song
            }
        }
    }

//在MusicVC中创建字符串如下:

 var strlablevalie:String!

无法工作,第二个控制器无法获取由第一个控制器传递的值。- Chandni 2分钟前编辑 - Chandni

-1
注意:如果我们正在使用故事板
步骤1:主控制器:
    // table row which row was selected
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)

        println("You selected cell #\(indexPath.row)!")

        nextScreenRow = indexPath.row

        // get to the next screen
        self.performSegueWithIdentifier("dashboard_static_screen_segue", sender: self)

    }

然后;

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

        if (segue.identifier == "dashboard_static_screen_segue") {
            var detailController = segue.destinationViewController as StaticScreens;
            detailController.screenNumber = nextScreenRow
        }

    }// end prepareForSegue

步骤2:详细控制器(StaticScreen)

// set variable into your detail controller

var screenNumber: NSInteger?

println("selected row \(screenNumber!)")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接