单击时循环显示图像的UIButton

时间:2010-03-23 02:04:06

标签: iphone

点击UIButton时,我想要循环显示三张图像。

我将如何做到这一点?

这是我到目前为止所做的,但它并没有真正起作用。

//the images
NSString* imageNames[] = {"MyFirstImage", "AnotherImage", whatever else};
int currentImageIndex = 0;

- (IBAction)change{
UIImage* imageToShow = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource: imageNames[currentImageIndex] ofType:@"png"];

if( currentImageIndex++ == sizeof(imageNames)/sizeof(NSString)) //check to see if you hit the last image
{
   currentImageIndex = 0; //start over
}
}

想法?

任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:1)

Steven建议将UIButton子类化为一个很好的建议。一旦你获得了更多关于Objective C的经验,你应该考虑他的方法,但我可以通过你发布的代码告诉你,你是Objective C的新手,所以你可能需要先学习使用基础的基础类。

您的代码无法正常工作的一个原因是您尝试将C字符串文字传递给pathForResource:,这需要一个NSString对象。 NSStrings是Objective C中的对象,而不是C中的字符指针。您可以使用文字语法构建NSString对象,@“引用前置”。

以下是使用Objective C Foundation类而不是C数据类型实现您尝试编写的算法的代码:

// YourController.h
@interface YourController :  UIViewController {
    NSArray *imageNames;
    NSInteger currentImageIndex;
    UIButton *yourButton;
}
@property (nonatomic, retain) NSArray *imageNames;
@property (nonatomic, retain) IBOutlet UIButton *yourButton; // Presumably connected in IB
- (IBAction)change;
@end
// YourController.m
#import "YourController.h"
@implementation YourController
@synthesize imageNames, yourButton;

- (void)dealloc {
    self.imageNames = nil;
    self.yourButton = nil;
    [super dealloc];
}

- (void)viewDidLoad {
    self.imageNames = [NSArray arrayWithObjects:@"MyFirstImage", @"AnotherImage", nil];
    currentImageIndex = 0;
    [super viewDidLoad];
}

- (IBAction)change {
    UIImage* imageToShow = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imageNames objectAtIndex:currentImageIndex] ofType:@"png"];
    currentImageIndex++;
    if (currentImageIndex >= imageNames.count) {
        currentImageIndex = 0;
    }
    [yourButton setImage:imageToShow forState:UIControlStateNormal];
}

@end

答案 1 :(得分:0)

您需要子类化UIButton并添加一个维护状态的新属性。您还需要具有三个属性来维护三个新状态的图像。然后在你的“drawRect:”方法中,根据你的状态换出标准按钮图像,然后调用[super drawRect:]方法。