Неустранимая ошибка при доступе к кадру одного viewcontroller в другом viewcontroller - PullRequest
0 голосов
/ 27 июня 2019

У меня есть шахматная доска на моем контроллере.Я хочу получить контроллер пространства зрения, шахматная доска которого не занята.

в следующем коде я упомянул три класса 1 - класс контроллера представления 2 - класс игры в шахматы 3 - класс chessBoard

В классе chessBoard, когда я вызываю метод getFrames.он показывает «фатальную ошибку», поскольку «SPACE_FROM_TOP_EDGE» и «TILE_SIZE» равны nil.

как получить «SPACE_FROM_TOP_EDGE» и «TILE_SIZE» для класса «view controller» в классе «chessBoard»?

    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"

1 Ответ

0 голосов
/ 27 июня 2019

Основная проблема здесь в том, что 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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...