Swift:我可以将 UIView 作为我可以创建/修改的参数传递吗?

Posted

技术标签:

【中文标题】Swift:我可以将 UIView 作为我可以创建/修改的参数传递吗?【英文标题】:Swift: can I pass a UIView as an argument that I can create/modify? 【发布时间】:2015-03-19 12:58:13 【问题描述】:

所以我有一个全局声明的 UIView:

var speedView: UIView!

然后我有一个将 UIView 作为参数并创建它的函数:

func buildView(view: UIView!) -> UIView 
    view = UIView(frame: CGRectMake(0, 0, 200, 100))
    ...

这不起作用,因为 view 参数自动设置为您无法修改的 let

一种解决方法是将其定义为var view...,如下所示:

func buildView(var view: UIView!) -> UIView  ... 

通过这样做,它在技术上是可行的,但后来如果我想去修改self.speedView,我无法访问它,因为它从未真正由该函数创建。

所以这个:

self.buildView(self.speedView)

我认为不会真正创建self.speedView

有什么想法可以有一个函数,将一些全局定义的视图作为参数,创建它们,然后我仍然可以访问这些全局定义的视图?

【问题讨论】:

为什么要全局定义视图? inout 也许,你在找这里吗? @damian 因为我想稍后访问和修改它们。不只是 UIViews 还有 UILabels 对,但为什么是全球性的?它们应该属于 ViewController,您应该让 ios 决定何时构造和销毁 ViewController(以便它可以为您合理地管理内存使用)。通过拥有全局变量,你否认了它的这种能力。 @damian 是的,对不起,我的意思是全局在控制器中,就在 class SomeController 之后 【参考方案1】:

好的,最好的解决方案是使用inout&,如下所示:

func buildView(inout view: UIView!) -> UIView  ... 

然后可以这样的功能:

self.buildView(&self.speedView)

当您将变量作为参数传递给 inout 参数时,您可以在变量名称前直接放置一个与号 (&),以表明该函数可以对其进行修改。

【讨论】:

【参考方案2】:

默认情况下参数是常量 - 如果需要,可以使用“let”

在大多数情况下这是 100% 可以的,您不应该修改参数


现在你想要一个 VAR,使用 inout 参数.. 不知道为什么,但这样你可以修改它

【讨论】:

inout 当我定义它或在函数参数中?编译器对其中任何一个都不满意... func(inout myVar:Type)【参考方案3】:

您确定要新视图吗?这是怎么回事:

import UIKit

class MVViewController11: UIViewController 

    @IBOutlet weak var speedView: UIView!
    @IBAction func buttonSelected(sender: AnyObject) 
        self.buildView(self.speedView)
    

    func buildView(var view: UIView!) 
        view.backgroundColor = UIColor.redColor()
        view.frame = CGRectMake(view.frame.origin.x + 10, view.frame.origin.y, view.frame.size.width, view.frame.size.height)
    

编辑

为我工作:

import UIKit

class MVViewController11: UIViewController 

    @IBOutlet weak var speedView: UIView!
    @IBAction func buttonSelected(sender: AnyObject) 
        self.buildView(self.speedView)
    
    @IBAction func button2Selected(sender: AnyObject) 
        self.builView2(self.speedView)
    

    @IBAction func button3Selected(sender: AnyObject) 
        self.speedView.backgroundColor = UIColor.yellowColor()
    
    func buildView(var view: UIView!) 
        view.backgroundColor = UIColor.redColor()
    

    func builView2(var view: UIView!) 
        view.backgroundColor = UIColor.blueColor()
    

注意:speedView 是通过 Interface Builder 连接的。

【讨论】:

但是如果以后有另一个函数可以改变视图的背景颜色,比如:self.speedView.backgroundColor = UIColor.blueColor() ?我会得到fatal error: unexpectedly found nil while unwrapping an Optional value

以上是关于Swift:我可以将 UIView 作为我可以创建/修改的参数传递吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果 Swift 通过值而不是引用传递,为啥我可以通过将 UIView 传递给函数来在 Swift 中操作 UIView 的属性? [复制]

如何在swift中剪切uiview的边缘

从按下按钮的 Swift 创建多个 UIView

Swift:通过 UIView 识别滚动

我可以使用 UIView(.xib 和类)作为许多视图的视图基础示例吗?

在 Swift 中从 UIView 创建 PDF