UIViews для iPhone — как связать переменные с UIView?

#iphone #xcode

#iPhone #xcode

Вопрос:

Я новичок в iphone и xcode. Возможно, это очень простой вопрос, но я не смог найти пример кода в книгах. Я хочу сделать следующее:

  • На экране должно быть 2 UIView
  • Каждый вид будет переходить по цвету радуги (красный / оранжевый / желтый / зеленый / синий / индиго / фиолетовый) с помощью средства распознавания жестов, например, если текущий цвет зеленый, если пользователь проводит пальцем вверх, UIView меняется на желтый, если пользователь проводит пальцем вниз, UIView меняется на синий.
  • Следовательно, каждый вид должен будет сохранять текущий цвет и соответствующим образом реагировать на пролистывания.

Я понимаю, как реализовать обнаружение пролистываний с помощью распознавателя жестов, но я не знаю, как заставить каждое представление сохранять отдельную переменную для текущего цвета. Мне нужен универсальный код, потому что в моем приложении будет более 2 UIViews, как только я выясню, как это делается.

Заранее спасибо.

Ответ №1:

Вы можете создать подкласс UIView , чтобы включить любые переменные, которые вам нравятся:

ColorSwiperView.h

 @interface ColorSwiperView : UIView
{
    ColorType currentColor;
}
@property (nonatomic, assign) ColorType currentColor;
@end
  

ColorSwiperView.m

 @implementation ColorSwiperView
@synthesize currentColor;

- (id)initWithFrame:(CGRect)frameRect
{
    if ((self = [super initWithFrame:frameRect]) == nil) { return nil; }
    currentColor = red;
    return self;
}

@end
  

Будет использоваться следующим образом:

 #import "ColorSwiperView"

...

ColorSwiperView * cView = [[ColorSwiperView alloc] initWithFrame:...];
cView.currentColor = green;
  

Примечание: предполагается, что вы определили перечисление для цветов:

 typedef enum
{
    red = 0,
    green = 1,
    ...
}
ColorType;
  

Ответ №2:

возможно, определение подкласса UIView что-то вроде:

 @interface RainbowView : UIView {
    UIColor *currentColor;
}

@property (nonatomic, retain) UIColor *currentColor;
@end
  

и создание 2 (или более) представлений этого класса в вашем контроллере просмотра в качестве выходных данных (если вы используете interface Builder):

 @class RainbowView;
@interface RainBowViewController : UIViewController {
     RainbowView *rainbowView1;
     RainbowView *rainbowView2;
}

@property (nonatomic, retain) IBOutlet RainbowView *rainbowView1;
@property (nonatomic, retain) IBOutlet RainbowView *rainbowView2;
@end
  

Ответ №3:

Так как вы собираетесь поддерживать массив цветов, скажем colorsArray , и назначать представлениям их цвет из этого выбора. Вы можете сделать это в обработчике прокрутки.

 - (void)handleSwipe:(UISwipeGestureRecognizer*)swipeGesture {
    UIView *view = swipeGesture.view;

    NSInteger currentColorIndex = [colorsArray indexOfObject:view.backgroundColor];
    NSInteger nextColorIndex = currentColorIndex   1;
    if ( nextColorIndex == [colorsArray count] ) {
        nextColorIndex = 0;
    }

    view.backgroundColor = [colorsArray objectAtIndex:nextColorIndex];
}
  

Таким образом, вам не нужно создавать подклассы.

Создание подклассов

Вы можете создать подкласс UIView и добавить в него свои собственные переменные экземпляра. Скажите,

 @interface RainbowView: UIView {
    NSInteger currentColorIndex;
}

@property (nonatomic, assign) NSInteger currentColorIndex;
...

@end

@implementation RainbowView

@synthesize currentColorIndex;

...

@end
  

В вашем методе обработки жестов,

 - (void)handleSwipe:(UISwipeGestureRecognizer*)swipeGesture {
    RainbowView *aView = (RainbowView*)swipeGesture.view;

    // Get the next color index to aView.currentColorIndex;
    aView.backgroundColor = [colorsArray objectAtIndex:nextColorIndex];
    aView.currentColorIndex = nextColorIndex;
}