ViewController 操作后,Swift UIView 自定义视图不会更新

Posted

技术标签:

【中文标题】ViewController 操作后,Swift UIView 自定义视图不会更新【英文标题】:Swift UIView custom view won't update after ViewController action 【发布时间】:2016-01-29 19:44:29 【问题描述】:

我希望视图控制器中的步进器在每次单击时更新我的​​自定义UIView 中的颜色。我不确定问题是由于类的实例还是变量的值(redd1greenn1bluee1)没有被更改。

这是我的第一个文件:

class ViewController: UIViewController 
    var colors = UIView1();
    @IBOutlet var redStepper: UIStepper!
    @IBOutlet var greenStepper: UIStepper!
    @IBOutlet var blueStepper: UIStepper!

    @IBAction func redChange(sender: UIStepper)
    
        redValue.text = Int(sender.value).description;
        colors.redd1 = Double(sender.value);
        //self.view.setNeedsDisplay()
    
    @IBAction func greenChange(sender: UIStepper)
    
        greenValue.text = Int(sender.value).description;
        colors.greenn1 = Double(sender.value);
        //self.view.setNeedsDisplay()
    
    @IBAction func blueChange(sender: UIStepper)
    
        blueValue.text = Int(sender.value).description;
        colors.bluee1 = Double(sender.value);
        //self.view.setNeedsDisplay()
     

这是我的第二个文件:

class UIView1: UIView 
    var redd1 = 0.0;
    var greenn1 = 0.0;
    var bluee1 = 0.0;

    override init(frame: CGRect)
    
        super.init(frame: frame)
    
    required init?(coder aDecoder: NSCoder)
    
        super.init(coder: aDecoder)
    
    override func drawRect(rect: CGRect)
    
        let circle = UIView(frame: CGRect(x: -75.0, y: -40.0, width: 200.0, height: 200.0))
        circle.layer.cornerRadius = 50.0;
        let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
        circle.backgroundColor = startingColor;
        addSubview(circle);
    

【问题讨论】:

【参考方案1】:

drawRect 仅在添加视图时调用,因此在您的示例中,drawRect 被调用一次,而不是在更改步进器之后调用。

相反,将您的步进文件更改为:

@IBOutlet var redStepper: UIStepper!
@IBOutlet var greenStepper: UIStepper!
@IBOutlet var blueStepper: UIStepper!

@IBAction func redChange(sender: UIStepper) 
    redValue.text = Int(sender.value).description;
    colors.redd1 = Double(sender.value);
    updateColor()


@IBAction func greenChange(sender: UIStepper) 
    greenValue.text = Int(sender.value).description;
    colors.greenn1 = Double(sender.value);
    updateColor()


@IBAction func blueChange(sender: UIStepper) 
    blueValue.text = Int(sender.value).description;
    colors.bluee1 = Double(sender.value);
    updateColor()
 

然后将 updateColor 函数添加到你的 UIView1 类中:

class UIView1: UIView 

    var redd1 = 0.0;
    var greenn1 = 0.0;
    var bluee1 = 0.0;

    func updateColor() 
        let circle = UIView(frame: CGRect(x: -75.0, y: -40.0, width: 200.0, height: 200.0))
        circle.layer.cornerRadius = 50.0;
        let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
        circle.backgroundColor = startingColor;
        addSubview(circle);
    

【讨论】:

首先,尝试在您的 IBActions 中添加 print(sender.value) 以确保您收到正确的值。如果发生这种情况,请将 print(redd1)、print(greenn1) 和 print(bluee1) 添加到您的 updateColor() 函数中,以查看是接收值还是运行。 是不是因为updateColor函数没有覆盖drawRect函数 可以去掉drawRect函数,不需要。如果 updateColor 正在运行,则表示正在添加圆圈。我注意到您的 x 和 y 有负值,请尝试将它们都设置为 0,以确保您的圈子不会被放置在不可见的地方。

以上是关于ViewController 操作后,Swift UIView 自定义视图不会更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIFT 中更改 ViewController 后保留集合视图滚动位置

在添加/删除 ViewController 作为子视图 Swift 后,ParentView 属性设置为 nil

在Swift中更改ViewController后禁用任务栏?

在故事板中添加新的视图控制器后是不是需要手动添加 ViewController.swift 文件?

如何在ViewController2.swift类的overCurrentContext视图中显示图像?

Swift ViewController 不响应 -getFile,无法连接操作,目标类