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

Posted

技术标签:

【中文标题】在 Swift 中的视图控制器之间传递数据【英文标题】:Passing Data between View Controllers in Swift 【发布时间】:2014-08-05 00:51:12 【问题描述】:

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

谢谢

【问题讨论】:

在 Swift 中完全一样,你不确定什么? 只是一般的 Swift 语法。我知道我不能在 Swift 中使用方括号,但在电子书中,它使用 .或括号在某些时候,我不确定在这里使用哪一个 点和括号语法是非常通用的编程语法,几乎可以在每种语言中找到。简而言之,() 用于调用函数,. 访问类/结构/等的成员/属性/函数。 谢谢,除了 ansViewController.num = theNum 部分,我现在已经弄清楚了大部分,因为它说 UIViewController 没有名为 theNum 的成员 @lagoon 你介意接受其中一个答案吗? 【参考方案1】:

假设我们站在 firstView 转到 DetailView 并希望将数据从 firstView 传递到 Detailview。要使用情节提要做到这一点,在 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中我只是演示了字符串类型)。

【讨论】:

如果您需要快速简单的东西,最好的解决方案!谢谢 这看起来像我需要的。我想将变量数组从 VC 1 传递到 VC 2。然后,在 VC 2 中,用户将在更多字段中输入信息。该信息将附加到数组中。完成后,阵列被发送到云端。我将您的代码复制到我的项目中并替换了我的 var 名称。我收到错误消息,“DispScreenOne 没有名为“toPass”的成员。 if (segue.identifier == "goToDispenseScreenTwo") var DispScreenOne = segue.destinationViewController as! DispenseScreenTwoViewController; DispScreenOne.toPass = enteredDataArray.text @Greg:请确保在 DispenseScreenTwoViewController,您有一个变量名 toPass @Lee:我有一个全局变量 toPass。当我尝试在我的任何视图控制器中将值设置为 toPass 时,它会识别 var。我错过了什么? 你有一个全局变量 toPass 到你的项目中并不意味着 DispenseScreenTwoViewController 有这个变量。这样你就会得到错误:'DispScreenOne 没有名为'toPass'的成员【参考方案2】:
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)

【讨论】:

在哪里提供视图控制器标识符 @zainullah 在故事板 ID 中。【参考方案3】:

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

按照以下步骤:

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)

【讨论】:

【参考方案4】:
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)
            

【讨论】:

【参考方案5】:
     @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 分钟前编辑【参考方案6】:

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

按照以下步骤:

1) 创建你想要的类型变量 (String,Int) 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)

应该可以解决你的问题

【讨论】:

【参考方案7】:

注意:如果我们使用故事板

第 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!)")

【讨论】:

以上是关于在 Swift 中的视图控制器之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中的视图之间传递数据

在 Swift 中的视图控制器之间传递自定义类数据

在 Swift 中的 ONE ViewController 中的视图之间传递数据

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

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

Swift 3 - 在视图控制器之间传递数据,然后再传递给另一个 2