Вот как бы я это сделал. (Я изменил имя нескольких переменных экземпляра: 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
. Затем я добавляю часть #import "MDBilboBaggins.h"
в файл .m: это может помочь ускорить время компиляции.
Как я уже упоминал в комментарии, вы, возможно, могли бы определить переменную currentImageIndex
внутри файла .m, однако это будет статическая переменная, которая является общей и общей для всех экземпляров класса. Это может быть полезно в некоторых ситуациях, но создавать проблемы в других. Например, представьте, что у нас есть 2 контроллера слайд-шоу, каждый из которых имеет разные изображения и показывает слайды в 2 разных окнах. Если бы они изменяли общую переменную currentImageIndex
, они бы испортили друг друга, если бы вы переключались между ними и начинали без разбора нажимать Предыдущий и Следующий. Вот почему в этом случае может иметь смысл сделать его переменной экземпляра, определив другие переменные вашего экземпляра в файле .h.
[EDIT] Относительно параметра :(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 отдельных методов.
[EDIT # 2] Заменил один метод с псевдокодированием (написанный в Safari) next:
на реальный код из одного из моих приложений, которые, как я знаю, работают.
Надеюсь, это поможет ...