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 的属性? [复制]