2014-01-12 5 views
0

다음 이미지와 이전 이미지를 보려면 두 개의 버튼이있는 간단한 이미지 브라우저를 만들었습니다. 범위 초과 NSArray 인덱스

enter image description here

여기에 코드입니다. 첫 번째 이미지, 그것은 경계 오류를 넘어 인덱스를 던질거야 때 나는 마지막 이미지 또는 이전 버튼 후 다음 버튼을 누릅니다 경우

#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 

내 문제는 말을한다.

어떻게 이런 일이 일어나지 않게 할 수 있습니까?

감사합니다.

답변

2

색인에 색인이 있는지 확인해야합니다. 당신은 당신의 nextButtonPressedpreviousButtonPressed 방법의 검증을 할 수 있습니다 : 인덱스가 배열의 끝합니다 (documentation 참조) 이상이면

- (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를 발생시킵니다.

+0

빠른 답변 감사합니다. 귀하의 솔루션은 완벽하게 작동합니다. 배열의 끝 부분에 도달했을 때 단추를 비활성화하는 방법을 알려주시겠습니까? – Isuru

+0

가장 간단한 방법은 "layoutButtons' 메서드를 만드는 것입니다.이 메서드는 배열의 끝에 도달하면 버튼을 비활성화합니다. ''nextButtonPressed''와''previousButtonPressed''를 호출 할 때마다, 그리고 초기 상태에 대한''viewDidLoad''의 끝에서이 메소드를 호출하십시오. –

1

이미지 배열 count 속성을 사용하여 다음 이미지 나 이전 이미지가 있는지 확인할 수 있기 때문에 현재 이미지 인덱스를 추적하고 있습니다.

- (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 
{  
    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 ; 
    } 
} 

가 시작 이후 :

- (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]; 
} 
+0

'nextButtonPressed'의 if-condition이 맞지 않습니다 ... –

+0

고마워요. 나는 그것을 고쳤다 :) – chrs

1

좋은 UI 습관은 당신이 마지막 이미지에 도달하면 다음 (또는 이전) 버튼을 비활성화하는 것입니다 (물론 배열의 오버 플로우를 방지) index = 0 당신은 viewDidLoad 방법에서 이전 버튼을 비활성화해야합니다 (다음에 누를 때까지 더 이전의 이미지를 가지고 있지 않는 한) 또는

+0

나는 너무 버튼을 비활성화 생각. 그것은 실제로 나의 다음 단계였습니다. 나는 당신의 코드를 시험해 보았다. 그것은 작동하지만 약간의 결함도 있습니다. 예를 들어, 앱 시작과 동시에 이전 버튼을 탭하면 충돌이 발생합니다. 또한 마지막 이미지에 도달하면 다음 버튼이 올바르지 않게 비활성화되지만 다시 돌아 가면 해당 버튼이 비활성화 된 상태로 유지됩니다. – Isuru

+0

정확합니다, 내 대답을 편집했습니다. 이제 올바르게 사용 중지/사용 설정을 할 수 있습니다. – giorashc

1

당신은 계수 같은 사용 가능한 IB에서 직접 수행 - 그래서 WRA ps 그 자체가 주위에. 이렇게하면 단추를 비활성화 할 필요가 전혀 없으며 사용자은 목록의 한쪽 끝에서 다른 끝까지보다 효율적으로 이동할 수 있습니다.

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

에 다음 줄

self.imageIndex++; 

을 대체하고 다음 줄을이 곳

self.imageIndex--; 

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