在Objective C中定义图像数组的索引

时间:2011-03-26 22:30:21

标签: iphone objective-c xcode ios4

我一直在试图找出如何使用下一个和上一个按钮的UIImageView,当点击它时将转到数组中的下一个或上一个图像。到目前为止,这就是我所拥有的。

在我的.h文件中,我声明了:

IBOutlet UIImageView *imageView;
NSArray *imageArray;

我还补充道:

-(IBAction) next;

在.m文件中我有:

-(void) viewDidLoad;
{
    imageArray = [[NSArray arrayWithObjects: 
                [UIImage imageNamed:@"1.png"], 
                  [UIImage imageNamed:@"2.png"], 
                  nil] retain];
}

现在,我正在努力奋斗。我在我的.m中定义了如下IBAction:

-(IBAction)next 
{
     if (currentImage + 1 == [imageArray count])
     {
         currentImage = 0;
     }
     UIImage *img = [imageArray objectAtIndex:currentImage];
     [imageView setImage:img]; 
     currentImage++;
}

我的问题是我不知道在哪里定义currentImage索引整数或如何定义它。它在标题中吗?实施?我该如何申报呢?

说实话,我甚至不能100%确定我目前拥有的代码是正确的,虽然我认为如果我可以定义索引,它会起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我就是这样做的。 (我已经更改了一些实例变量的名称:currentImage听起来像是一个指向图像的指针(UIImage *),而不仅仅是一个整数值;在末尾添加Index使得现在可能很明显它是一个整数,但是当你在一个月内重新访问这段代码(或者你编写的其他代码)时,它可能不太明显;或者可能只是我... ...

MDSlideshowController.h

#import <UIKit/UIKit.h>
@class MDBilboBaggins;

@interface MDSlideshowController : NSObject {
   IBOutlet UIImageView   *imageView;
   NSArray                *imageArray;
   NSUInteger             currentImageIndex;
   BOOL                   someOtherVariable;
   MDBilboBaggins         *bilboBaggins;
   // keep adding more instance variables as needed
}
- (IBAction)previous:(id)sender;
- (IBAction)next:(id)sender;
@end

MDSlideshowController.m

#import "MDSlideshowController.h"
#import "MDBilboBaggins.h"
// you could perhaps define currentImageIndex here, but see notes below:
// NSUInteger currentImageIndex = 0;

@implementation MDSlideshowController
  // `currentImageIndex` is automatically initialized to 0 during init
  // `someOtherVariable` is automatically initialized to 0 (NO) during init
-(void) viewDidLoad
{
imageArray = [[NSArray arrayWithObjects: 
                [UIImage imageNamed:@"1.png"], 
                  [UIImage imageNamed:@"2.png"], 
                  nil] retain];
     [imageView setImage:[imageArray
                 objectAtIndex:currentImageIndex]];
}
- (IBAction)previous:(id)sender {
    if (currentImageIndex == 0) {
        currentImageIndex = [imageArray count] - 1;
    } else {
        currentImageIndex--;
    }
    [imageView setImage:[imageArray objectAtIndex:currentImageIndex]];
}
- (IBAction)next:(id)sender {
    if (currentImageIndex + 1 >= [imageArray count]) {
        currentImageIndex = 0;
    } else {
        currentImageIndex++;
    }
    [imageView setImage:[imageArray objectAtIndex:currentImageIndex]];
}
@end

基本上,您将实例变量放在已定义的变量之下。它们几乎可以是任何类型。您可以使用Cocoa Touch所知道的类型,或者您自己创建的类。在这个例子中,我说使用MDBilboBaggins语句有一个名为@class MDBilboBaggins的特殊类。然后,我在.m文件中添加#import "MDBilboBaggins.h"部分:这有助于加快编译时间。

正如我在评论中提到的,您可以在.m文件中定义currentImageIndex变量,但是,它将是一个静态变量,它是该类的所有实例共有和共享的。这在某些情况下很有用,但在其他情况下会产生问题。例如,假设我们有2个幻灯片控制器,每个控制器都创建了不同的图像,并在2个不同的窗口中显示幻灯片。如果他们正在修改共享的currentImageIndex变量,那么如果你要在它们之间切换并开始不加选择地点击“上一页”和“下一页”,它们就会互相混乱。这就是为什么在这种情况下,通过在.h文件中定义其他实例变量来使其成为实例变量可能更有意义。

[编辑]关于:(id)sender参数:在这个例子中,根本没有使用它,我通常是出于习惯,因为在某些情况下,它可以节省大量代码,并简化事情戏剧性。例如,假设您有9个不同的按钮,并且您希望每个按钮加载特定图像(或执行特定操作)。现在,您可以定义9个单独的方法,例如- (IBAction)button1Clicked;,或者您可以轻松地执行此操作,只需定义单个- (IBAction)loadImage:(id)sender方法即可。在您的nib文件中,您将为每个按钮指定一个不同的标记(NSInteger值),例如1 - 9.然后在您的单个方法中,您可以执行此操作:

- (IBAction)loadImage:(id)sender {
   NSInteger buttonTag = [(NSButton *)sender tag];
   [imageView setImage:[UIImage imageNamed:
       [NSString stringWithFormat:@"image%ld.png",buttonTag]]];
}

在这种情况下,sender是发送消息的对象,该消息将是单击的按钮。虽然这是一个人为的例子,通过提供一个额外的参数,我可能保存了100行不必要的代码和9种不同方法的复杂性。

[编辑#2]用我知道可以使用的某个应用程序中的实际代码替换了一个伪编码(用Safari编写)next:方法。

希望这会有所帮助......

答案 1 :(得分:0)

你需要在标题中声明currentindex,如下所示:

NSInteger currentImage;

这样,值将在整个视图生命周期中保存