【问题标题】:Passing an object with data from one view to another view in Swift using Segue使用 Segue 在 Swift 中将带有数据的对象从一个视图传递到另一个视图
【发布时间】: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.

标签: ios swift


【解决方案1】:

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

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

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

【讨论】:

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