使用 Segue 在 Swift 中将带有数据的对象从一个视图传递到另一个视图

Posted

技术标签:

【中文标题】使用 Segue 在 Swift 中将带有数据的对象从一个视图传递到另一个视图【英文标题】:Passing an object with data from one view to another view in Swift using Segue 【发布时间】:2018-03-22 02:08:30 【问题描述】:

我正在尝试使用 Swift4 将带有数据的对象从一个视图传递到另一个视图。但是,我在尝试打印时遇到了这个问题。 这是我收到的消息:

2018-03-21 21:47:03.542578-0400 数独[64427:1070575] > 的窗口不等于 的视图窗口!

这是我的视图的图片。 segue的标识符:setupScreen

这是setPlayer中的代码:

class setPlayer: UIViewController 
    var singleUser:playerInfor=playerInfor()
    var randomGame:Int = -1
    var playerName:String=""
    @IBOutlet weak var txtPlayerName: UITextField!
    var sizeOfSudoku:Int = 9 //for project 1, let take one size of sudoku

    override func viewDidLoad() 
        super.viewDidLoad()
        self.view.backgroundColor = UIColor(patternImage: UIImage(named: "Communication-Network-Vector-Illustration.jpg")!)
        self.txtPlayerName.layer.borderWidth=2.0
        self.txtPlayerName.layer.borderColor=UIColor.blue.cgColor
        // Do any additional setup after loading the view.
    

    func randomNumber()
        self.randomGame=Int(arc4random_uniform(3)+1)
    

    func initialize()
        //if(size)

        if txtPlayerName.text?.isEmpty ?? true 
            self.playerName="Player1"
         else 
            self.playerName=self.txtPlayerName.text!
        
        self.singleUser=playerInfor(playerName:self.playerName,size:self.sizeOfSudoku,time:0, randomSudoku:self.randomGame)
        //print (self.singleUser.size)
    

    @IBAction func startButton(_ sender: Any) 
        initialize()
        performSegue(withIdentifier: "setupScreen", sender: self.singleUser)

    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "setupScreen"
            if let destination=segue.destination as?setupSudoku
                destination.objectPlayer=sender as?playerInfor
                print(singleUser.playerName)
            
        
    

    @IBAction func size9(_ sender: Any) 
        self.sizeOfSudoku=9
    

    @IBAction func Size6(_ sender: Any) 
        self.sizeOfSudoku=9
    

这是playerInfor

import Foundation
import UIKit

class playerInfor
    var playerName:String=""
    var size:Int=0
    var time:Int=var randomSudoku:Int=0

    init(playerName:String,size:Int,time:Int,randomSudoku:Int) 
        self.playerName=playerName
        self.size=size
        self.time=time
        self.randomSudoku=randomSudoku
    

这里是设置数独

class setupSudoku: UIViewController , UICollectionViewDelegate, UICollectionViewDataSource
    @IBOutlet weak var stackViewButtons: UIStackView!
    @IBOutlet weak var myCollectionView: UICollectionView!
    var newNumber=0
    var objectPlayer:playerInfor!

    override func viewDidLoad() 
        super.viewDidLoad()
        print(self.objectPlayer?.time)

    

【问题讨论】:

究竟是哪一行导致了您的问题? 仅供参考 - 类/结构/枚举名称应以大写字母开头。变量/函数/案例名称以小写字母开头。 @maddy,我认为它来自函数 startButton() 和准备。 @maddy:我正在尝试将带有数据的对象从 setPlayer 传递给 setupSudoku。但是,我无法在 setupSudoku 中获取对象的值。所以它返回消息“2018-03-21 21:47:03.542578-0400 Sudoku[64427:1070575] >'s window is not equal to 's view's window!”当我试图在对象中打印一个值时 复制代码时出现错误: var time:Int=var randomSudoku:Int=0 。它应该是: var time:Int =0 var randomSudoku:Int =0. 【参考方案1】:

您在情节提要中错误地设置了转场,它正在尝试转场两次。要确认是这种情况,请在情节提要中选择您的转场并检查您的按钮是否突出显示,如下所示:

要解决此问题,请删除此转场并创建一个新转场,方法是从视图控制器(而不是按钮)控制拖动到目标位置,如下所示:

确保将新的 segues 标识符重置回 setupScreen。那么你应该很高兴!

【讨论】:

感谢@Jake。我已经按照你说的修好了。我有一个问题,因为 Xcode 允许我从按钮拖动到新控制器。那么我应该什么时候从一个按钮拖到一个新的控制器上呢? 从按钮拖动将导致 Xcode 在点击按钮时为您执行代码performSegue(withIdentifier: <identifier>, sender: <UIButton>),并将 UIButton 作为发送者点击。在 segue 之前不需要任何配置时,您通常会使用它。例如。你不需要调用你的 initialize() 函数,你可以完全删除整个 @IBAction func startButton(_ sender: Any) 函数。但是您已经有了执行 segue 的代码,所以这是更容易解决的问题。

以上是关于使用 Segue 在 Swift 中将带有数据的对象从一个视图传递到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 4 中将数据解析为 vc 始终为零

Swift 3 数据从主控制器到带有 Firebase 和 segue 的视图控制器

Swift 导航控制器嵌入在带有 segue 的选项卡栏中

CSStickyHeaderFlowLayout swift接收器没有标识符的segue

Swift:无法通过使用发送者的 segue 设置 [String]

使用自定义表格视图单元格中的故事板segue