我一直在试图找出如何使用下一个和上一个按钮的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%确定我目前拥有的代码是正确的,虽然我认为如果我可以定义索引,它会起作用。
有什么建议吗?
答案 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;
这样,值将在整个视图生命周期中保存