Ios NSArray索引越界错误

Ios NSArray索引越界错误,ios,objective-c,image,indexing,nsarray,Ios,Objective C,Image,Indexing,Nsarray,我创建了一个带有两个按钮的简单图像浏览器,用于查看下一个和上一个图像 这是密码 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @property (strong, nonatomic) NSArray *images; @property (assign, nonatomic) NSInteger ima

我创建了一个带有两个按钮的简单图像浏览器,用于查看下一个和上一个图像

这是密码

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) NSArray *images;
@property (assign, nonatomic) NSInteger imageIndex;
@property (strong, nonatomic) UIBarButtonItem *nextButton;
@property (strong, nonatomic) UIBarButtonItem *prevButon;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Adding Next and Previous buttons
    self.nextButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"next"] style:UIBarButtonItemStylePlain target:self action:@selector(nextButtonPressed)];
    self.prevButon = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"previous"] style:UIBarButtonItemStylePlain target:self action:@selector(previousButtonPressed)];

    self.navigationItem.rightBarButtonItems = @[self.nextButton, self.prevButon];


    // Loading images
    self.images = @[
                    [UIImage imageNamed:@"1"],
                    [UIImage imageNamed:@"2"],
                    [UIImage imageNamed:@"3"],
                    [UIImage imageNamed:@"4"],
                    [UIImage imageNamed:@"5"],
                    [UIImage imageNamed:@"6"],
                    [UIImage imageNamed:@"7"],
                    [UIImage imageNamed:@"8"],
                    [UIImage imageNamed:@"9"]
                    ];

    self.imageIndex = 0;
    self.imageView.image = self.images[self.imageIndex];
}

- (void)nextButtonPressed
{
    self.imageIndex++;
    self.imageView.image = self.images[self.imageIndex];
}

- (void)previousButtonPressed
{
    self.imageIndex--;
    self.imageView.image = self.images[self.imageIndex];
}

@end
我的问题是,如果我在最后一张图片后点击next按钮,或者在第一张图片出现时点击previous按钮,它会抛出一个索引越界错误

我怎样才能阻止这种事情发生


谢谢。

您必须检查索引中是否存在索引。 您可以在按下
nextbutton
和按下
previousbutton
方法中进行验证:

- (void)nextButtonPressed
{
    if (imageIndex < ([self.images count] - 1))
    {
        self.imageIndex++;
        self.imageView.image = self.images[self.imageIndex];
    }
}

- (void)previousButtonPressed
{
    if (imageIndex >= 1)
    {
        self.imageIndex--;
        self.imageView.image = self.images[self.imageIndex];
    }
}
-(无效)下一个按钮按下
{
如果(图像索引<([self.images count]-1))
{
self.imageIndex++;
self.imageView.image=self.images[self.imageIndex];
}
}
-(无效)上一个按钮按下
{
如果(imageIndex>=1)
{
self.imageIndex--;
self.imageView.image=self.images[self.imageIndex];
}
}

有关详细信息,如果索引超出数组末尾,NSArray将引发一个
NSRangeException

您必须检查索引是否存在于索引中。 您可以在按下
nextbutton
和按下
previousbutton
方法中进行验证:

- (void)nextButtonPressed
{
    if (imageIndex < ([self.images count] - 1))
    {
        self.imageIndex++;
        self.imageView.image = self.images[self.imageIndex];
    }
}

- (void)previousButtonPressed
{
    if (imageIndex >= 1)
    {
        self.imageIndex--;
        self.imageView.image = self.images[self.imageIndex];
    }
}
-(无效)下一个按钮按下
{
如果(图像索引<([self.images count]-1))
{
self.imageIndex++;
self.imageView.image=self.images[self.imageIndex];
}
}
-(无效)上一个按钮按下
{
如果(imageIndex>=1)
{
self.imageIndex--;
self.imageView.image=self.images[self.imageIndex];
}
}

有关详细信息,如果索引超出数组末尾,NSArray将引发一个
NSRangeException

您正在跟踪当前图像索引,这很好,因为您可以使用图像数组计数属性来检查是否有下一个图像或上一个图像

- (void)nextButtonPressed
{
    if ( self.imageIndex < self.images.count - 1) {
         self.imageIndex++;
         self.imageView.image = self.images[self.imageIndex];
    }
}

- (void)previousButtonPressed
{
    if ( self.imageIndex > 0 ) {
        self.imageIndex--;
        self.imageView.image = self.images[self.imageIndex];
    }
}
-(无效)下一个按钮按下
{
if(self.imageIndex0){
self.imageIndex--;
self.imageView.image=self.images[self.imageIndex];
}
}
另一种选择是在到达最后一张图像时重新开始

- (void)nextButtonPressed
{
    if ( self.imageIndex < self.images.count - 1) {
         self.imageIndex++;
    } else {
         self.imageIndex = 0
    }
    self.imageView.image = self.images[self.imageIndex];
}

- (void)previousButtonPressed
{
    if ( self.imageIndex > 0 ) {
        self.imageIndex--;
    } else {
        self.imageIndex = self.images.count - 1;
    }
    self.imageView.image = self.images[self.imageIndex];
}
-(无效)下一个按钮按下
{
if(self.imageIndex0){
self.imageIndex--;
}否则{
self.imageIndex=self.images.count-1;
}
self.imageView.image=self.images[self.imageIndex];
}

您可以跟踪当前图像索引,这很好,因为您可以使用“图像数组计数”属性来检查是否存在下一个图像或上一个图像

- (void)nextButtonPressed
{
    if ( self.imageIndex < self.images.count - 1) {
         self.imageIndex++;
         self.imageView.image = self.images[self.imageIndex];
    }
}

- (void)previousButtonPressed
{
    if ( self.imageIndex > 0 ) {
        self.imageIndex--;
        self.imageView.image = self.images[self.imageIndex];
    }
}
-(无效)下一个按钮按下
{
if(self.imageIndex0){
self.imageIndex--;
self.imageView.image=self.images[self.imageIndex];
}
}
另一种选择是在到达最后一张图像时重新开始

- (void)nextButtonPressed
{
    if ( self.imageIndex < self.images.count - 1) {
         self.imageIndex++;
    } else {
         self.imageIndex = 0
    }
    self.imageView.image = self.images[self.imageIndex];
}

- (void)previousButtonPressed
{
    if ( self.imageIndex > 0 ) {
        self.imageIndex--;
    } else {
        self.imageIndex = self.images.count - 1;
    }
    self.imageView.image = self.images[self.imageIndex];
}
-(无效)下一个按钮按下
{
if(self.imageIndex0){
self.imageIndex--;
}否则{
self.imageIndex=self.images.count-1;
}
self.imageView.image=self.images[self.imageIndex];
}

一个好的用户界面习惯是,一旦到达最后一个图像,就禁用“下一个”(或上一个)按钮(当然还可以防止数组溢出):


由于您从
index=0
开始,您应该在
viewDidLoad
方法中禁用上一个按钮(因为在按下下一步之前,您没有更多的上一个图像),或者如果可能的话,直接在IB中禁用下一个(或上一个)按钮(当然还要防止阵列中的溢出):


由于您从
index=0
开始,您应该禁用
viewDidLoad
方法中的“上一步”按钮(因为在按下“下一步”之前,您不会有更多的上一个图像),或者如果可能的话直接在IB中执行该操作

您可以像这样使用,因此它会自动缠绕。 这样,您就不需要禁用按钮,而且用户从列表的一端到另一端的访问也更容易

替换以下行

self.imageIndex++;
self.imageIndex--;

下面这一行在哪里

self.imageIndex++;
self.imageIndex--;
取代

self.imageIndex = (self.imageIndex + [self.images count] - 1) % [self.images count];

您可以像这样使用,这样它就可以自我包裹。 这样,您就不需要禁用按钮,而且用户从列表的一端到另一端的访问也更容易

替换以下行

self.imageIndex++;
self.imageIndex--;

下面这一行在哪里

self.imageIndex++;
self.imageIndex--;
取代

self.imageIndex = (self.imageIndex + [self.images count] - 1) % [self.images count];

谢谢。我已经修好了:)谢谢。我已经修好了:)我也想过禁用按钮。这实际上是我的下一步。我试过你的密码。它可以工作,但也有一些缺陷。例如,如果我在应用程序启动时点击“上一步”按钮,它就会崩溃。当我看到最后一张图片时,“下一步”按钮被禁用,这是正确的,但当我返回时,该按钮仍处于禁用状态。您是正确的,我编辑了我的答案,现在您将能够正确禁用/启用。我也想过禁用按钮。这实际上是我的下一步。我试过你的密码。它可以工作,但也有一些缺陷。例如,如果我在