为什么类型"UIView"的值没有来自引用 UIView 变量的成员?



我想将变量引用到特定函数。但是,有一个称为Value of type 'UIView' has no member 'lineTo'的错误显然,whatSelectObject变量包含成员存在的类。因此,我使用了if语句"可选绑定"。但是结果是相同的。

//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
class ObjectView: UIView {
    var outGoingLine : CAShapeLayer?
    var inComingLine : CAShapeLayer?
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    func lineTo(connectToObj: ObjectView) -> CAShapeLayer {
        let path = UIBezierPath()
        path.move(to: CGPoint(x: self.frame.maxX, y: self.frame.midY))
        path.addLine(to: CGPoint(x: connectToObj.frame.minX, y: connectToObj.frame.midY))
        let line = CAShapeLayer()
        line.path = path.cgPath
        line.lineWidth = 5
        line.fillColor = UIColor.clear.cgColor
        line.strokeColor = UIColor.gray.cgColor
        connectToObj.inComingLine = line
        outGoingLine = line
        return line
    }
}

class MyViewController : UIViewController {
    var whatSelectView: UIView?
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white
        let object = ObjectView(frame: CGRect(x: 10, y: 100, width: 100, height: 100))
        object.backgroundColor = UIColor.orange
        view.addSubview(object)
        whatSelectView = object
        let object2 = ObjectView(frame: CGRect(x: 200, y: 200, width: 100, height: 100))
        object2.backgroundColor = UIColor.red
        view.addSubview(object2)
        if let s = whatSelectView {
            view.layer.addSublayer(s.lineTo(connectToObj: object2)) // error
        }
        self.view = view
    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

!此代码是相关代码减少的一个示例,以帮助受访者理解它。我可以直接参考object变量,但我必须无效地引用whatSelectView

为什么在参考变量中导致错误?还是我对可选绑定是错误的?

的确,Uiview没有任何成员和方法称为lineTo,您必须使用铸造(在您的情况下为as?

这样:

if let s = whatSelectView as? ObjectView {
     view.layer.addSublayer(s.lineTo(connectToObj: object2)) // error
}

除此之外,对whatSelectView的引用应该很弱,因为视图已经保持了强烈的引用,因为它是一个子视图。

,您根本不需要IF条件,您已经使用对象对视图进行了引用。

所以,这是我更好地实施的建议

class MyViewController : UIViewController {
    weak var whatSelectView: ObjectView?
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white
        let object = ObjectView(frame: CGRect(x: 10, y: 100, width: 100, height: 100))
        object.backgroundColor = UIColor.orange
        view.addSubview(object)
        whatSelectView = object
        let object2 = ObjectView(frame: CGRect(x: 200, y: 200, width: 100, height: 100))
        object2.backgroundColor = UIColor.red
        view.addSubview(object2)
        let shape = object.lineTo(connectToObj: object2)
        view.layer.addSublayer(shape)
        self.view = view
    }
}
if let s = whatSelectView as? ObjectView {
   view.layer.addSublayer(s.lineTo(connectToObj: object2))
}

这应该解决您的问题。

更改

var whatSelectView: UIView?

to

var whatSelectView: ObjectView?

它将编译。正如@larme所说,当您将其声明为简单的UIView时,您将无法访问任何成员&UIView子类上的函数。

最新更新