【问题标题】:Fatal error during accessing frame of one viewcontroller in another viewcontroller在另一个视图控制器中访问一个视图控制器的帧时出现致命错误
【发布时间】:2019-06-27 14:39:07
【问题描述】:

我的视图控制器上有一个棋盘。我想获得视图控制器的空间,该棋盘未被占用。

在下面的代码中我提到了三个类 1-视图控制器类 2-国际象棋课 3-棋盘类

当我调用“getFrames”方法时,在 chessBoard 类中。它显示“致命错误”,因为“SPACE_FROM_TOP_EDGE”和“TILE_SIZE”为零。

如何在“chessBoard”类中获取“视图控制器”类的“SPACE_FROM_TOP_EDGE”和“TILE_SIZE”?

    class ViewController: UIViewController {
    var SPACE_FROM_LEFT_EDGE: CGFloat!
    var SPACE_FROM_TOP_EDGE: CGFloat!
    var TILE_SIZE: CGFloat!

    override func viewDidLoad() {
        super.viewDidLoad()

        TILE_SIZE = self.view.frame.size.width / 8

        SPACE_FROM_TOP_EDGE = self.view.frame.size.height - (self.view.frame.size.width / 2)


        chessPiece = []

        myChessGame = ChessGame.init(viewController: self)
    }




        class ChessGame {
        var theChessBoard: chessBoard
        init(viewController: ViewController) {
            theChessBoard = chessBoard.init(viewController: viewController)

        }
    }




    class chessBoard {

    var board: [[Piece]]
    var vc: ViewController
    var ROWS = 8
    var COLS = 8
    var whiteKing: King!
    var blackKing: King!

    static func getFrames(forRow row: Int, forColoumn col: Int) -> CGRect{

        let vc = ViewController()
        print(vc.SPACE_FROM_TOP_EDGE)
        print(vc.TILE_SIZE)
        let x =   (CGFloat(col) * 40.0)

        let y =  vc.SPACE_FROM_TOP_EDGE! + (CGFloat(row) * 40.0)


        return CGRect(origin: CGPoint(x: x, y: y), size: CGSize(width: 40.0, height: 40.0))
    }
    init(viewController: ViewController) {
        vc = viewController
        let oneRowOfBoard = Array(repeating: Dummy(), count: COLS)
        board = Array(repeating: oneRowOfBoard, count: ROWS)

         board[row][col] = Rook(frame: chessBoard.getFrames(forRow: row, forColoumn: col), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc)
}
}


error message - "Fatal error: Unexpectedly found nil while unwrapping an Optional value"

【问题讨论】:

  • 因为在你访问它的时候,它还没有调用viewDidLoad()。所以没有设置值。在viewDidLoad() 中打印,你会看到它是否被打印。

标签: swift uiviewcontroller


【解决方案1】:

这里的主要问题是getFrames 是一个静态方法,并且您正在使用在函数内部创建的本地 ViewController 实例,并且由于您遇到问题的属性设置在 viewDidLoad 内部,它没有没有为本地对象调用你会崩溃。

我对您的代码的印象是您希望使用作为类属性的视图控制器对象,因此我建议您将该函数设为实例方法并使用属性vc,在init(viewController:) 中设置,而不是

func getFrames(forRow row: Int, forColoumn col: Int) -> CGRect{
    print(vc.SPACE_FROM_TOP_EDGE)
    print(vc.TILE_SIZE)
    let x =   (CGFloat(col) * 40.0)
    let y =  vc.SPACE_FROM_TOP_EDGE! + (CGFloat(row) * 40.0)

    return CGRect(origin: CGPoint(x: x, y: y), size: CGSize(width: 40.0, height: 40.0))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多