这个问题在这里已有答案:
我有问题试图找出为什么我得到线程1致命错误:索引超出我的应用程序范围。我的应用程序显示8个图像显示开始图像幻灯片。出于某种原因,我得到了这个错误,我无法理解。有没有办法删除此错误?谁能帮我?
var images = [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 = images[value]
}
@IBAction func NextButton(_ sender: Any) {
Slider1.value += 1
ImageView.image = images[Int(Slider1.value)]
self.ImageView.animationImages = self.images
self.ImageView.animationDuration = 15.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 = images[Int(Slider1.value)]
self.ImageView.animationImages = self.images
self.ImageView.animationDuration = 15.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(withTimeInterval: 8, repeats: true) { _ in
self.NextButton(self);
}
super.viewDidLoad()
setup()
images = [#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())
}
}
}
该错误告诉您正在访问images
数组范围之外的元素。在viewDidLoad
中,您将images
数组设置为8个元素。这些元素的范围为0-7。如果您尝试访问该范围之外的元素,则会出现您所看到的超出范围的错误。
看看你的代码,问题是在NextButton
和PrevButton
中,你调整了滑块值和索引,但你没有检查以确保你没有超过数组边界。如果您在第一张图片上并单击“上一页”按钮,则表示您已超出范围。如果您在最后一张图片上并单击“下一步”按钮,则表示您已超出范围。
您要做的是确保数组中没有负索引或索引大于或等于数组中的项数。从用户界面的角度来看,最佳解决方案是在第一张图像上禁用“上一页”按钮,在最后一张图像上禁用“下一步”按钮。
既然你问了一个例子,这里有一些代码在增加滑块值后放入nextButton
:
if slider1.value >= images.count {
return
}
减去滑块值后的prevButton
代码:
if slider1.value < 0 {
return
}
现在,如果数组索引超出范围,函数将退出。
最后要检查的是images
阵列正在填充viewDidLoad
。在viewDidLoad
中设置断点并逐步执行代码。如果加载MainImage.jpg文件时出现问题,则该数组将为空,当您访问该数组时,您将超出范围错误。