【问题标题】:Using UIView function from other class causes crashes使用其他类的 UIView 函数会导致崩溃
【发布时间】: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 的新实例,并立即在这个新实例上调用你的方法。这是行不通的,因为即使它没有崩溃,您的结果也不会可见。

标签: ios swift


【解决方案1】:

您正在初始化一个新的ViewController 并尝试立即对其进行处理。由于多种原因表明您可能是初学者,这将不起作用。 (欢迎!)您要么需要查看 UIViewController 的工作方式(特别是生命周期),要么查看对象的工作方式 :)

【讨论】:

  • 没有冒犯 OP,但我会说如果他两者都做我会是最好的。
  • 可能......虽然不想假设太多:)
  • 我知道初始化它是错误的,但我尝试了共享 var 视图,但也失败了。只是没有关于从控制器外部使用视图的好的文档。必须有一种简单的方法来做到这一点。
  • 我通过另一种方式修复它,在我的视图中使用我的套接字共享实例。没关系,但我想这只是框架。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
相关资源
最近更新 更多