NSTimer 自动启动图像幻灯片的问题
NSTimer Issues to start image slideshow automatically
我发现在启动启动画面后尝试在我的应用程序上启动图像幻灯片时出现问题。由于某种原因,图像幻灯片开始时间太长,我不得不单击上一个按钮或下一个按钮或我的 UISlider 来显示幻灯片,然后应用程序崩溃。我的代码中有什么错误或缺失吗?目标是自动启动图像幻灯片。下面是我的代码。此外,我在下面的 link 中有一张关于我的图片幻灯片设置的屏幕截图。
var Array = [UIImage]()
var counter = 2
var time = Timer()
@IBOutlet weak var menuButton: UIBarButtonItem!
@IBOutlet weak var ImageView: UIImageView!
@IBOutlet weak var Slider1: UISlider!
@IBAction func Slider(_ sender: UISlider) {
_ = 0
let value = Int(sender.value)
ImageView.image = Array[value]
}
@IBAction func NextButton(_ sender: Any) {
Slider1.value += 1
ImageView.image = Array[Int(Slider1.value)]
self.ImageView.animationImages = self.Array
self.ImageView.animationDuration = 3.0
self.ImageView.animationRepeatCount = 0
self.ImageView.startAnimating()
UIView.transition(with: self.ImageView, duration: 5.0, options: .transitionCrossDissolve, animations: {self.ImageView.image = self.ImageView.image}, completion: nil)
}
@IBAction func PrevButton(_ sender: Any) {
Slider1.value -= 1
ImageView.image = Array[Int(Slider1.value)]
self.ImageView.animationImages = self.Array
self.ImageView.animationDuration = 3.0
self.ImageView.animationRepeatCount = 0
self.ImageView.startAnimating()
UIView.transition(with: self.ImageView, duration: 5.0, options: .transitionCrossDissolve, animations: {self.ImageView.image = self.ImageView.image}, completion: nil)
}
//Set Status Bar to light content (white)
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
override func viewDidLoad() {
//Set Navigation Bar color Example Home, Back button
self.navigationItem.backBarButtonItem?.tintColor = UIColor.white;
time = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector: #selector(getter: self.Slider1),
userInfo: nil,
repeats: true)
super.viewDidLoad()
setup()
Array = [#imageLiteral(resourceName: "MainImage1.jpg"), #imageLiteral(resourceName: "MainImage2.jpg"), #imageLiteral(resourceName: "MainPage3.jpg"), #imageLiteral(resourceName: "MainImage4.jpg"), #imageLiteral(resourceName: "MainImage5.jpg"), #imageLiteral(resourceName: "MainImage6.jpg"), #imageLiteral(resourceName: "MainImage7.jpg"), #imageLiteral(resourceName: "MainImage8.jpg")]
sideMenus()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func setup(){
self.navigationController?.navigationBar.tintColor = UIColor.white
}
override var prefersStatusBarHidden: Bool{
return false
}
var navigationBarAppearace = UINavigationBar.appearance()
override func viewDidAppear(_ animated: Bool){
}
func sideMenus() {
if revealViewController() != nil {
menuButton.target = revealViewController()
menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
revealViewController().rearViewRevealWidth = 275
revealViewController().rightViewRevealWidth = 160
view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}
}
}`
计时器的目标选择器是在您指定的时间间隔内调用的函数。在上面的代码中,您使用滑块 属性 的 getter 作为计时器调用的函数——这不是您想要的。计时器将每 5 秒调用一次 getter,但 getter 函数所做的只是 "get" 滑块的值 属性.
您希望定时器的选择器为您做一些事情,例如触发"next"按钮功能。为什么不使用允许您指定闭包来包装行为的计时器创建形式?类似于:
time = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in
self.NextButton(self)
}
(这在 Swift 中似乎比使用 #selector
指向 objc
公开函数更优雅。)
我发现在启动启动画面后尝试在我的应用程序上启动图像幻灯片时出现问题。由于某种原因,图像幻灯片开始时间太长,我不得不单击上一个按钮或下一个按钮或我的 UISlider 来显示幻灯片,然后应用程序崩溃。我的代码中有什么错误或缺失吗?目标是自动启动图像幻灯片。下面是我的代码。此外,我在下面的 link 中有一张关于我的图片幻灯片设置的屏幕截图。
var Array = [UIImage]()
var counter = 2
var time = Timer()
@IBOutlet weak var menuButton: UIBarButtonItem!
@IBOutlet weak var ImageView: UIImageView!
@IBOutlet weak var Slider1: UISlider!
@IBAction func Slider(_ sender: UISlider) {
_ = 0
let value = Int(sender.value)
ImageView.image = Array[value]
}
@IBAction func NextButton(_ sender: Any) {
Slider1.value += 1
ImageView.image = Array[Int(Slider1.value)]
self.ImageView.animationImages = self.Array
self.ImageView.animationDuration = 3.0
self.ImageView.animationRepeatCount = 0
self.ImageView.startAnimating()
UIView.transition(with: self.ImageView, duration: 5.0, options: .transitionCrossDissolve, animations: {self.ImageView.image = self.ImageView.image}, completion: nil)
}
@IBAction func PrevButton(_ sender: Any) {
Slider1.value -= 1
ImageView.image = Array[Int(Slider1.value)]
self.ImageView.animationImages = self.Array
self.ImageView.animationDuration = 3.0
self.ImageView.animationRepeatCount = 0
self.ImageView.startAnimating()
UIView.transition(with: self.ImageView, duration: 5.0, options: .transitionCrossDissolve, animations: {self.ImageView.image = self.ImageView.image}, completion: nil)
}
//Set Status Bar to light content (white)
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
override func viewDidLoad() {
//Set Navigation Bar color Example Home, Back button
self.navigationItem.backBarButtonItem?.tintColor = UIColor.white;
time = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector: #selector(getter: self.Slider1),
userInfo: nil,
repeats: true)
super.viewDidLoad()
setup()
Array = [#imageLiteral(resourceName: "MainImage1.jpg"), #imageLiteral(resourceName: "MainImage2.jpg"), #imageLiteral(resourceName: "MainPage3.jpg"), #imageLiteral(resourceName: "MainImage4.jpg"), #imageLiteral(resourceName: "MainImage5.jpg"), #imageLiteral(resourceName: "MainImage6.jpg"), #imageLiteral(resourceName: "MainImage7.jpg"), #imageLiteral(resourceName: "MainImage8.jpg")]
sideMenus()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func setup(){
self.navigationController?.navigationBar.tintColor = UIColor.white
}
override var prefersStatusBarHidden: Bool{
return false
}
var navigationBarAppearace = UINavigationBar.appearance()
override func viewDidAppear(_ animated: Bool){
}
func sideMenus() {
if revealViewController() != nil {
menuButton.target = revealViewController()
menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
revealViewController().rearViewRevealWidth = 275
revealViewController().rightViewRevealWidth = 160
view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}
}
}`
计时器的目标选择器是在您指定的时间间隔内调用的函数。在上面的代码中,您使用滑块 属性 的 getter 作为计时器调用的函数——这不是您想要的。计时器将每 5 秒调用一次 getter,但 getter 函数所做的只是 "get" 滑块的值 属性.
您希望定时器的选择器为您做一些事情,例如触发"next"按钮功能。为什么不使用允许您指定闭包来包装行为的计时器创建形式?类似于:
time = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in
self.NextButton(self)
}
(这在 Swift 中似乎比使用 #selector
指向 objc
公开函数更优雅。)