Определение индекса для массива изображений в Objective C - PullRequest
1 голос
/ 27 марта 2011

Я пытался выяснить, как получить 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];
}

Теперь вот где я борюсь.У меня IBAction определен следующим образом в моем .m:

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

Моя проблема в том, что я не знаю, где определить целое число индекса currentImage или как его определить.Это в шапке?Реализация?И как именно я могу это объявить?

Если честно, я даже на 100% не уверен, что код, который у меня сейчас есть, правильный, хотя я думаю, что если я смогу определить индекс, он будет работать.

Любой совет?

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

Вот как бы я это сделал. (Я изменил имя нескольких переменных экземпляра: 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: на реальный код из одного из моих приложений, которые, как я знаю, работают.

Надеюсь, это поможет ...

0 голосов
/ 27 марта 2011

вам нужно объявить currentindex в заголовке следующим образом:

NSInteger currentImage;

Таким образом, значение сохраняется в течение всего времени существования представления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...