在Swift中的视图控制器之间传递数据

时间:2014-06-14 17:49:51

标签: ios swift uistoryboard uistoryboardsegue

我正在尝试将应用程序从Objective-C转换为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,我将不胜感激!

由于

7 个答案:

答案 0 :(得分:36)

我们假设我们站在 firstView 转到 DetailView ,并希望将数据从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(当然你可以根据需要改变变量的类型,在这个EX我只是为字符串类型演示)。

答案 1 :(得分: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)
}

答案 2 :(得分:2)

在swift中将字符串或任何数据从一个控制器传递到另一个控制器。

遵循以下步骤:

1)在子控制器中创建var abc:string!

的属性

2)创建childcontroller的对象

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

答案 3 :(得分:0)

private implicit val messageReader : Reads[B] =
  (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq())).map(B.create)

答案 4 :(得分: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!

答案 5 :(得分:0)

快速将字符串或任何数据从一个控制器传递到另一个控制器。

请按照以下步骤操作:

1)创建所需类型的变量(字符串,整数) var test:字符串!

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)

那应该可以解决您的问题

答案 6 :(得分:-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!)")