快速放置在函数中时无法触发uiview.animate
Posted
技术标签:
【中文标题】快速放置在函数中时无法触发uiview.animate【英文标题】:unable trigger uiview.animate when placed inside a function in swift 【发布时间】:2018-03-19 18:54:13 【问题描述】:我无法触发动画,我将下面的函数放在viewdidload
函数之外,并创建了一个自定义函数,该函数将在点击按钮时触发。但是它没有创建动画,而是在下面给了我一个错误。这是错误
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
这是要触发的函数
@objc func triggeranimation()
UIView.animate(withDuration: 0.5, animations:
let intro:introViewController = introViewController()
intro.Title.backgroundColor = UIColor.blue
, completion: nil)
我在 viewdidload 中以编程方式添加了按钮,该按钮将触发上述功能。我尝试将自定义函数放在 viewdidload
函数之前和之后,但错误结果相同。请帮助为什么它告诉我当我清楚地在同一个视图控制器中时它发现为零。
let nextBtn = UIButton(frame: CGRect(x:0, y: 0, width: 0, height: 0))
nextBtn.translatesAutoresizingMaskIntoConstraints = false
nextBtn.setTitle("Next", for: UIControlState.normal)
nextBtn.backgroundColor = UIColor.blue
nextBtn.addTarget(self, action: Selector("triggeranimation"), for: .touchUpInside)
nextBtn.setTitleColor(UIColor.white, for: .normal)
self.view.addSubview(nextBtn)
// width cant change for some unknown reason
nextBtn.widthAnchor.constraint(equalToConstant: 10)
nextBtn.heightAnchor.constraint(equalToConstant: 20)
nextBtn.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20).isActive = true
nextBtn.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10).isActive = true
完整代码
class introViewController: UIViewController
var Title:UILabel!
var nextBtn:UIButton!
override func viewDidLoad()
super.viewDidLoad()
let Title = UILabel(frame: CGRect(x: self.view.frame.size.width / 2, y: (self.view.frame.size.height + 30), width: 50, height: 10))
Title.translatesAutoresizingMaskIntoConstraints = false
Title.text = "WELCOME"
Title.font = UIFont.systemFont(ofSize: 24, weight: .bold)
Title.textAlignment = .center
Title.textColor = UIColor.black
self.view.addSubview(Title)
Title.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -250).isActive = true
Title.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
let nextBtn = UIButton(frame: CGRect(x:0, y: 0, width: 0, height: 0))
nextBtn.translatesAutoresizingMaskIntoConstraints = false
nextBtn.setTitle("Next", for: UIControlState.normal)
nextBtn.backgroundColor = UIColor.blue
nextBtn.addTarget(self, action: Selector("triggeranimation"), for: .touchUpInside)
nextBtn.setTitleColor(UIColor.white, for: .normal)
self.view.addSubview(nextBtn)
// width cant change for some unknown reason
nextBtn.widthAnchor.constraint(equalToConstant: 10)
nextBtn.heightAnchor.constraint(equalToConstant: 20)
nextBtn.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20).isActive = true
nextBtn.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10).isActive = true
@objc func triggeranimation()
UIView.animate(withDuration: 0.5, animations:
let intro:introViewController = introViewController()
intro.Title.backgroundColor = UIColor.blue
, completion: nil)
此外,我还尝试将 UIView.animate 移动到 viewdidload 中,但它根本没有动画,它只是立即改变颜色。
更新:我确实通过更改 Title 变量解决了发现的 nil 问题
var Title:UILabel!
转为var Title:UILabel! = UILabel()
但我仍然对动画有问题,即使我将 DURATION 延长到 5.0,它也没有使任何动画立即改变颜色
【问题讨论】:
您的introViewController()
中有什么?
我上面有一个func,上面有一个uibutton和一个label name title。单击按钮时将更改背景颜色
问题是如何实例化introViewController
。因为如果您使用界面文件并且不加载它,则 ui 元素将是 nil
。
对不起,我的问题可能引起了误解。你的变量 introViewController
是什么?你是如何实例化它的?
我通过添加 var Title:UILabel 来添加标题标签!在顶部然后我将其添加到 view.addsubview 上的 viewdidload 就像上面的按钮一样
【参考方案1】:
问题在于intro
是一个新初始化的视图控制器,它与所讨论的实例完全无关。例如,不会在该新实例上调用 viewDidLoad。相反,您只想使用“self”,即加载的视图控制器。
@objc func triggeranimation()
UIView.animate(withDuration: 0.5, animations:
//let intro:introViewController = introViewController()
self.Title.backgroundColor = UIColor.blue
, completion: nil)
您的 viewDidLoad 代码中似乎也存在问题,您正在尝试初始化 Title 和 nextBtn 属性。相反,您不小心创建了同名的本地常量。这就是为什么您的属性为零的原因。
// You have this now, which creates a local constant
//let Title = UILabel(..
// You want this instead, which initializes your property
self.Title = UILabel(..
当然,对 nextBtn 做同样的事情。
【讨论】:
我还是那样做,结果还是一样 你很接近。但我从 var Title:UILabel!进入var Title:UILabel! = UILabel()
以上是关于快速放置在函数中时无法触发uiview.animate的主要内容,如果未能解决你的问题,请参考以下文章
DBUS 代码在放置在守护进程中时崩溃,但在没有守护进程代码的独立独立 main() 函数中运行良好
当消息存在于 SQS 队列中时触发 AWS 中的 Lambda 函数