基于Swift3中的viewWithTag更改UIView

基于Swift3中的viewWithTag更改UIView,swift,uiimageview,swift3,viewwithtag,Swift,Uiimageview,Swift3,Viewwithtag,在Objective C中,使用转换为(UIImageView*)的标记,可以很容易地更改UIView的图像,例如: [ (UIImageView*) [self.view viewWithTag:n+1] setImage:[UIImage imageNamed:@"bb.png"]]; 我一直在试图找到一个最新的例子,可以在Swift 3中做同样的事情。我终于找到了解决方案-您需要使用作为关键字,并可选择强制转换为UIImageView?。如果您需要这样做,下面是一些工作代码: // SW

在Objective C中,使用转换为
(UIImageView*)
的标记,可以很容易地更改
UIView
的图像,例如:

[ (UIImageView*) [self.view viewWithTag:n+1] setImage:[UIImage imageNamed:@"bb.png"]];
我一直在试图找到一个最新的例子,可以在Swift 3中做同样的事情。我终于找到了解决方案-您需要使用作为关键字,并可选择强制转换为
UIImageView?
。如果您需要这样做,下面是一些工作代码:

// SWIFT3 change UIView based on viewWithTag (johnrpenner, toronto)

override func viewDidLoad() 
{
    super.viewDidLoad()

    var n : Int = 0
    for i in stride(from:7, to:-1, by:-1) {
        for j in 0...7 {
            n = i*8+j

            let sqImageView = UIImageView(image: UIImage(named: "wp.png"))
            sqImageView.tag = n+1

            sqImageView.frame.origin.x = (CGFloat(j) * cellX + xStartAdj)
            sqImageView.frame.origin.y = ( (CGFloat(7-i) * cellY) + yStartAdj )

            view.addSubview(sqImageView)
            }
        }
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
//func touchesBegan(touches: Set<UITouch>, with event: UIEvent?)
{
    if let touch = touches.first {
        let touchPos = touch.location(in: self.view)  //swift3
        let touchSQ : Int = coordToSQ(touchPoint:touchPos)

        // change UIView.image based on viewWithTag
        if var findView : UIImageView = view.viewWithTag(touchSQ+1) as! UIImageView? { findView.image = UIImage(named: "bp.png")! }     
    }
}
//SWIFT3基于viewWithTag更改UIView(多伦多约翰彭纳)
重写func viewDidLoad()
{
super.viewDidLoad()
变量n:Int=0
对于步幅较大的i(从:7到:-1,由:-1){
对于0…7中的j{
n=i*8+j
让sqImageView=UIImageView(图像:UIImage(名为:“wp.png”))
sqImageView.tag=n+1
sqImageView.frame.origin.x=(CGFloat(j)*cellX+xStartAdj)
sqImageView.frame.origin.y=((CGFloat(7-i)*cellY)+yStartAdj)
view.addSubview(sqImageView)
}
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?)
//func touchesbeated(触摸:设置,带有事件:UIEvent?)
{
如果让触摸=先触摸{
让touchPos=touch.location(在:self.view中)//swift3
让TouchQ:Int=coordToSQ(接触点:touchPos)
//基于viewWithTag更改UIView.image
如果var findView:UIImageView=view.viewWithTag(touchq+1)为!UIImageView?{findView.image=UIImage(名为:“bp.png”)!}
}
}
不管怎样——花了几个小时才弄明白这一点,而且所有关于Swift 2或Objective C的东西都有——认为Swift 3的例子可能有用

干杯! 约翰就是这样

if let findView = self.view.viewWithTag(touchSQ+1) as? UIImageView {
    findView.image = UIImage(named: "bp.png")
}

thx nirav-使用let。。作为?UIImageView。。这是个好答案

这可能是一个有用的功能:

func setImageView(byTag:Int, toImageNamed:String)
{
    if let findView = self.view.viewWithTag(byTag) as? UIImageView {findView.image = UIImage(named: toImageNamed)}
    return
}

它与var一起工作,尽管let是更好的形式。如果您不改变值,那么最好使用
let
:)它与var一起工作,尽管let是更好的形式。虽然if-let检测并不是真正的问题——有很多这样的例子——但不明显的是,为了改变uiview,首先必须将其转换为!图像视图?(或在使用let时不使用?时)。您可以更改uiview.hidden和除图像以外的所有内容,而不使用as?如果不起作用,@johnrpiner您必须使用
作为
UIView
转换为
UIImageView
,并且
用于可选绑定,而不是
这是强制包装,如果不是
imageView
,它可能会导致崩溃。您能告诉我我的答案和您的答案有什么区别吗?您只需添加函数即可编写相同的答案?