【问题标题】:How do I update my instance variables in swift?如何快速更新我的实例变量?
【发布时间】:2016-01-28 22:19:31
【问题描述】:
我希望在单击步进器时改变圆圈的颜色。我认为问题在于我正在使用该类的一个实例。
这是我的第一个文件:
类视图控制器:UIViewController {
@IBOutlet var redValue: UILabel!
@IBOutlet var greenValue: UILabel!
@IBOutlet var blueValue: UILabel!
@IBOutlet var redStepper: UIStepper!
@IBOutlet var greenStepper: UIStepper!
@IBOutlet var blueStepper: UIStepper!
var redd = 0.0;
var greenn = 0.0;
var bluee = 0.0;
@IBAction func redChange(sender: UIStepper)
{
redValue.text = Int(sender.value).description;
redd = sender.value;
}
@IBAction func greenChange(sender: UIStepper)
{
greenValue.text = Int(sender.value).description;
greenn = sender.value;
}
@IBAction func blueChange(sender: UIStepper)
{
blueValue.text = Int(sender.value).description;
bluee = sender.value;
}
}
这是我的第二个文件:
类 UIView1: UIView {
var colors = ViewController();
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override func drawRect(rect: CGRect)
{
let circle2 = UIView(frame: CGRect(x: -25.0, y: 10.0, width: 100.0, height:100.0))
circle2.layer.cornerRadius = 50.0
let startingColor2 = UIColor(red: (CGFloat(colors.redd)/255),
green: (CGFloat(colors.greenn))/255, blue: (CGFloat(colors.bluee))/255, alpha: 1.0)
circle2.backgroundColor = startingColor2;
addSubview(circle2);
}
}
【问题讨论】:
标签:
ios
swift
uiview
uiviewcontroller
【解决方案1】:
可能存在各种连接问题,因为我们看不到该代码/IB。但是,我怀疑您至少错过了通知视图需要重绘自身的调用,因为基础值已更改。
self.view.setNeedsDisplay()
这是我用来试验的整个游乐场,对您的代码进行了各种修改。检查最后一个副本以查看更改。注意:UI 元素并没有真正创建,我在手动设置UIStepper.value 后模拟了一个光滑。
import UIKit
class ViewController: UIViewController {
@IBOutlet var redValue: UILabel!
@IBOutlet var greenValue: UILabel!
@IBOutlet var blueValue: UILabel!
@IBOutlet var redStepper: UIStepper!
@IBOutlet var greenStepper: UIStepper!
@IBOutlet var blueStepper: UIStepper!
var redd = 100.0;
var greenn = 100.0;
var bluee = 100.0;
@IBAction func redChange(sender: UIStepper)
{
redValue?.text = Int(sender.value).description
redd = sender.value
self.view.setNeedsDisplay()
}
@IBAction func greenChange(sender: UIStepper)
{
greenValue.text = Int(sender.value).description
greenn = sender.value
}
@IBAction func blueChange(sender: UIStepper)
{
blueValue.text = Int(sender.value).description
bluee = sender.value
}
}
class UIView1: UIView {
var colors = ViewController()
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override func drawRect(rect: CGRect)
{
let circle2 = UIView(frame: CGRect(x: -25.0, y: 10.0, width: 100.0, height:100.0))
circle2.layer.cornerRadius = 50.0
let startingColor2 = UIColor(red: CGFloat(colors.redd/255.0),
green: (CGFloat(colors.greenn))/255,
blue: (CGFloat(colors.bluee))/255,
alpha: 1.0)
circle2.backgroundColor = startingColor2;
addSubview(circle2);
}
}
let v = UIView1(frame: CGRectMake(0,0,400, 240))
v.colors.view = v
let rstepper = UIStepper(frame: CGRectMake(0,0,300,50))
rstepper.maximumValue = 255.0
rstepper.value = 240.0
v.colors.redChange(rstepper)
// inspect the view now:
v
【解决方案2】:
是的,确实是这个问题。
var colors = ViewController()
创建一个与包含您的视图的视图控制器的实例无关的新实例。在视图的 drawrect 代码中对 colors.redd 的引用未到达活动视图控制器。
关系应该在另一个方向。您的视图控制器应该知道您的自定义视图的实例(通常通过插座),它应该设置您的视图的颜色属性或至少作为它的一种委托。