我相信這已被問了一百萬次。但我的搜索不斷提出客觀的C解決方案。使用UIView函數從其他類導致崩潰
我從另一個類調用一個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))
}
}
}
顯示代碼創建您調用方法的視圖控制器的代碼。 – dan
增加了功能。 –
你需要做什麼,即「我希望它更新屏幕」是什麼意思?你想轉移到'ViewController'嗎?在你的'getChatMessage'函數中,你創建了一個新的'ViewController'實例,並立即在這個新實例上調用你的方法。這是行不通的,因爲即使它沒有崩潰,你的結果也不可見。 – Losiowaty