【问题标题】:NSTimer Issues to start image slideshow automaticallyNSTimer 自动启动图像幻灯片的问题
【发布时间】:2019-07-16 01:28:42
【问题描述】:

我发现在启动初始屏幕后尝试在我的应用上启动图像幻灯片时出现问题。由于某种原因,图像幻灯片需要太长时间才能启动,我不得不单击上一个按钮或下一个按钮或我的 UISlider 来显示幻灯片,然后应用程序崩溃。我的代码有什么问题或遗漏吗?目标是自动启动图像幻灯片。下面是我的代码。另外,我在下面的链接中有我的图像幻灯片设置的屏幕截图。

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())
    }
}
    }` 

【问题讨论】:

  • 与您的问题无关,但请注意,Swift 中的标准做法是以小写字母开头命名变量和方法。类和结构以大写字母开头。将变量命名为与类相同是一个非常糟糕的主意。例如,您的 Array 变量将与 Array 类混淆。你真的应该将Array 重命名为images,因为它是一个图像数组。
  • rmaddy 感谢您的回复,我能够将 Array 类重命名为图像。谢谢。

标签: ios swift nstimer


【解决方案1】:

计时器的目标选择器是在您指定的时间间隔内调用的函数。在上面的代码中,您将滑块属性的 getter 用作计时器调用的函数——这不是您想要的。计时器将每 5 秒调用一次该 getter,但该 getter 函数所做的只是“获取”滑块属性的值。

您希望计时器的选择器为您一些事情,例如,触发“下一步”按钮功能。为什么不使用允许您指定闭包来包装行为的计时器创建形式?比如:

time = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in
    self.NextButton(self)
}

(这在 Swift 中似乎比使用 #selector 指向 objc 暴露的函数更优雅。)

【讨论】:

  • 定时器块最好使用[weak self]。这样,计时器的生命周期就绑定到视图控制器的生命周期,您不必手动使其无效。有关更多信息,请参阅here。向下滚动到“专业提示”部分
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多