微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在UIView中更改类Swift

如何解决在UIView中更改类Swift

我想使用一个按钮来切换UIView的内容。 我设置了两个类graphClass1和graphClass2。 (该按钮在topView中。)

当我单击按钮时,我从debugPrint收到了“我的按钮”消息,但没有从类内部得到debugPrint消息。因此,我添加setNeedsdisplay,但这没有帮助。

(这是一个简化的版本-实际上有很多类-这就是为什么我尝试重用同一视图而不是仅创建两个单独的视图的原因。)

  1. 如何获取适当的类以在视图中显示

  2. 因为当我来回切换时graphClass1会创建其他子视图,所以graphClass1的子视图的数量会继续增加吗?如果是这样,我如何在离开时将其删除? (我知道self.layer.sublayers = niltextView.removeAll()会把它们留到返回之前-如果他们甚至将其全部删除。)

  3. 在按钮切换中,而不是使用Bool测试哪个图形,我更喜欢像if currentGraph == GraphClass1这样更直观的东西,但这给了我错误消息:Binary operator '==' cannot be applied to operands of type 'UIView' and 'GraphClass1.Type'。我该如何解决

class ViewController: UIViewController {

    @IBOutlet var topView: UIView!    
    @IBOutlet var bottomView: UIView!    

    @IBOutlet var myButton: UIButton!    
    
    var graph1: Bool = true

    var currentView = UIView()
        
    override func viewDidLoad() {
        super.viewDidLoad()        
        bottomView = GraphClass1()
        setConstraints()
    }    

    @IBAction func myButton(_ sender: Any) {
        debugPrint("my button")
        if graph1 {
            currentView.removeFromSuperview()            
            currentView = GraphClass2()
            cv2.addSubview(currentView)
            graph1 = false
        }
        else {
            currentView.removeFromSuperview()
            currentView = GraphClass1()
            cv2.addSubview(currentView)
            graph1 = true
        }

        cv2.setNeedsdisplay()
    }
}

class GraphClass1: UIView {

    var textView = UITextView()

    override func draw(_ rect: CGRect) {
        super.draw(rect)                
        self.layer.sublayers = nil
        textView.removeAll()
        createTextView()
        debugPrint("inside GraphClass1")
    }

func createTextView() {
    textView = UITextView(frame: CGRect(x: 8,y: 8,width: 300,height: 100))
    textView.text = "Test,this is only a test"
    textView.textAlignment = .center
    textView.font = UIFont(name: "Courier",size: 16)
    textView.backgroundColor = .orange
    self.addSubview(textView)
    }
}

class GraphClass2: UIView {
    override func draw(_ rect: CGRect) {
        super.draw(rect)                
        debugPrint("inside GraphClass2")
    }
}

解决方法

您应该将UIView()添加到GraphClass()作为子视图,而不是将GraphClass()更改为bottomView()。要切换GraphClass1(),您可以将其从bottomView()中删除,并将GraphClass2()设置为bottomView()的子视图。删除视图也会删除其所有子视图。

,

首先,在界面生成器中创建一个bottomView,就像顶视图一样。它将像一个占位符。您将拥有;

      @IBOutlet var bottomView: UIView!    

在viewDidLoad中,您可以根据需要添加特定的视图

      bottomView.addSubView(myInstanceOfAGraphView.view)
      myInstanceOfAGraphView.didMove(toParent: bottomView) 

我将为每个图形视图创建视图控制器,并根据需要进行切换。

需要更改时,请使用删除其视图;

      myInstanceOfAGraphView.view.removeFromSuperview()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。