【发布时间】:2016-08-17 21:51:56
【问题描述】:
我相信这已经被问过一百万次了。但我不断寻找客观的 C 解决方案。
我正在从不同的类调用 UIViewController 类。我希望它更新屏幕。当从 ViewController 调用该函数时,它工作正常。但是当它被另一个类调用时,它会崩溃:
tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))
表示解包后的可选项返回 nil。 tempImageView 是 UIViewController 中 UIImageView 的一个出口。我想我不清楚外部类函数调用是如何工作的。有谁知道这个的解决方案吗?
编辑:
class ViewController: UIViewController, NSURLSessionDelegate {
var lastPoint = CGPoint.zero
var red: CGFloat = 0.0
var green: CGFloat = 0.0
var blue: CGFloat = 0.0
var brushWidth: CGFloat = 10.0
var opacity: CGFloat = 1.0
var swiped = false
var xArray = [CGFloat]()
var yArray = [CGFloat]()
var scale: CGFloat = 0.0
@IBOutlet weak var mainImageView: UIImageView!
@IBOutlet weak var tempImageView: UIImageView!
......
func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) {
// 1
UIGraphicsBeginImageContext(self.view.frame.size)
let context = UIGraphicsGetCurrentContext()
tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))
// 2
CGContextMoveToPoint(context, fromPoint.x, fromPoint.y)
CGContextAddLineToPoint(context, toPoint.x, toPoint.y)
// 3
CGContextSetLineCap(context, .Round)
CGContextSetLineWidth(context, brushWidth)
CGContextSetRGBStrokeColor(context, red, green, blue, 1.0)
CGContextSetBlendMode(context, .Normal)
// 4
CGContextStrokePath(context)
// 5
self.tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
self.tempImageView.alpha = opacity
UIGraphicsEndImageContext()
}
以及来自另一个控制器的调用
func getChatMessage() {
socket.on("browser") { (dataArray, socketAck) -> Void in
for _ in dataArray {
ViewController().drawLineFrom(CGPoint(x: 0,y: 0), toPoint: CGPoint(x: 1,y: 1))
}
}
}
【问题讨论】:
-
显示创建视图控制器的代码,并在其中调用方法。
-
新增功能。
-
您需要做什么,即“我希望它更新屏幕”是什么意思?你想搬到
ViewController吗?目前在你的getChatMessage函数中,你创建了一个ViewController的新实例,并立即在这个新实例上调用你的方法。这是行不通的,因为即使它没有崩溃,您的结果也不会可见。