swift - 在另一个视图控制器中访问一个视图控制器的帧时出现致命错误
问题描述
我的视图控制器上有一个棋盘。我想获得视图控制器的空间,该棋盘未被占用。
在下面的代码中,我提到了三个类 1- 视图控制器类 2- 象棋游戏类 3- chessBoard 类
当我调用“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"
解决方案
这里的主要问题是这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))
}
推荐阅读
- html - 将元素放入容器的问题
- android - Flutter中成功的firebase身份验证发生错误
- python - BeautifulSoup --- if / else --- 检查容器是否包含另一个容器
- angular - 在表格行上打开新选项卡单击angular6
- c++ - 使用 AVX2 C++ 的选择性加载
- performance - 为什么 Raku 对多维数组的表现如此糟糕?
- python - Python Dataframes:如何删除某些字符并更改数据类型?
- python - 固定长度记录
- spring - 未注入 Hybris OOTB bean
- react-native - 在单个选项卡上使用多个屏幕