我创建了一个简单的图像浏览器,其中有两个按钮可以查看下一个和上一个图像。
这是代码。
#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
我的问题是,如果我在第一个图像的最后一个图像或上一个按钮之后点击下一个按钮,它会抛出索引超出边界错误。
如何阻止这种情况发生?
谢谢。
答案 0 :(得分:2)
您必须检查索引中是否存在索引。
您可以使用nextButtonPressed
和previousButtonPressed
方法进行验证:
- (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];
}
}
有关信息,如果索引超出数组的末尾,则NSArray会引发NSRangeException
。(请参阅documentation)。
答案 1 :(得分:1)
您正在跟踪当前图像索引,这很好,因为您可以使用它来检查是否存在下一个图像或使用图像数组计数属性。
- (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];
}
}
当您到达最后一张图片时,另一种选择是重新开始。
- (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];
}
答案 2 :(得分:1)
一个好的UI习惯是在到达最后一个图像时禁用下一个(或上一个)按钮(当然也可以防止数组溢出):
- (void)nextButtonPressed
{
self.imageIndex++;
self.imageView.image = self.images[self.imageIndex];
[self.previousButton setEnabled:YES];
if (self.imageIndex == [self.images count] - 1) {
[self.nextButton setEnabled:NO];
return ;
}
}
- (void)previousButtonPressed
{
self.imageIndex--;
self.imageView.image = self.images[self.imageIndex];
[self.nextButton setEnabled:YES];
if (self.imageIndex == 0) {
[self.previousButton setEnabled:NO];
return ;
}
}
由于您从index = 0
开始,您应该在viewDidLoad
方法中停用上一个按钮(因为您没有更多的先前图像,直到您按下一个)或者如果可能的话直接在IB中执行
答案 3 :(得分:1)
您可以像这样使用模数 - 因此它会自行包装。 这样您就不需要禁用按钮,这也使用户 更容易从列表的一端更有效地进入另一端。
替换以下行
self.imageIndex++;
与
self.imageIndex = (self.imageIndex + 1) % [self.images count];
并且您有以下行
self.imageIndex--;
替换为
self.imageIndex = (self.imageIndex + [self.images count] - 1) % [self.images count];