Повторное использование XIB на разных экранах - PullRequest
0 голосов
/ 25 августа 2018

У меня есть 4 экрана с одним и тем же видом:

View have inactive state

View have active state

И один экран имеет тот же вид, но с немного другим пользовательским интерфейсом:

enter image description here

Итак, мой вопрос: могу ли я использовать один xib и адаптировать состояния (активный, неактивный) и изменить пользовательский интерфейс для другого экрана? Как я могу это сделать?

1 Ответ

0 голосов
/ 27 августа 2018

Вот пример такого класса

В вашем .m файле пользовательского класса XIB, если вы используете target-c.

- (void)foo:(NSString*)labelText andButtonText:(NSString*)buttonTitle {
  //Do your code here for some screen like change labels and button text
}

- (void)bar:(NSString*)labelText andButtonText:(NSString*)buttonTitle {
  //Do your code here for some another screen and change labels and button text
}

В вашем .h файлепользовательский класс XIB, если вы используете target-c.

- (void)foo:(NSString*)labelText andButtonText:(NSString*)buttonTitle;

- (void)bar:(NSString*)labelText andButtonText:(NSString*)buttonTitle;

В вашем контроллере представления, где вы хотите отобразить пользовательский интерфейс

Создайте экземпляр вашей xib или добавьте через interfacebuilder And OnВаш экземпляр пользовательского класса вызывает метод по мере необходимости.

Ниже приведен класс, который я использовал в одном из моих проектов для ясного понимания.

#import <UIKit/UIKit.h>
#import "DYRateView.h"

@interface LevelAndRankDetails : UIView
@property (nonatomic, strong) IBOutlet UIView* contentView;
@property (nonatomic, strong) IBOutlet UIView* viewContainer;
@property (nonatomic, strong) IBOutlet UILabel* lblLevel;
@property (nonatomic, strong) IBOutlet UILabel* lblRanking;
@property (weak, nonatomic) IBOutlet DYRateView *viewRate;

- (void)setLevel:(NSNumber*)level andRanking:(NSNumber*)ranking;
- (void)setupUI;
@end

.m Файл

#import "LevelAndRankDetails.h"
#import "AppDelegate.h"
#import "Constants.h"

@implementation LevelAndRankDetails

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (id)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]){
        [self commonSetup];
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self)
    {
        [self commonSetup];

    }
    return self;
}


- (void)layoutSubviews {
    [super layoutSubviews];
}

- (void)viewFromNibForClass {
    [[NSBundle mainBundle] loadNibNamed:[[self class] description] owner:self options:nil];
    [self addSubview:self.contentView];
    self.contentView.frame = self.bounds;
}

- (void)commonSetup {

    [self viewFromNibForClass];

    //For View's Corner Radius
    self.contentView.layer.cornerRadius = 12;
    self.contentView.layer.masksToBounds = YES;
    self.contentView.backgroundColor = kDefaultBackgroundGreyColor;
    self.viewContainer.backgroundColor = kDefaultBackgroundGreyColor;//[UIColor clearColor];
    self.backgroundColor = kDefaultBackgroundGreyColor;
    //self.viewContainer.backgroundColor = UIColorFromRGB(0xBB9657);//[kLearnFromLightColor colorWithAlphaComponent:0.5];

    self.viewRate.rate = 0;
    self.viewRate.editable = NO;
    self.viewRate.delegate = nil;
    self.viewRate.alignment = RateViewAlignmentCenter;
    self.viewRate.backgroundColor = [UIColor clearColor];
    [self.viewRate setEmptyStarImage:[UIImage imageNamed:@"StarEmpty"]];
    UIImage* imageFullStar = [[UIImage imageNamed:@"StarFull"] imageTintedWithColor:kSliderDarkYellowColor];
    [self.viewRate setFullStarImage:imageFullStar];
    self.lblLevel.textColor = [UIColor whiteColor];
    self.lblRanking.textColor = [UIColor whiteColor];
    //For Teacher label
}

- (void)setupUI {
    self.contentView.layer.cornerRadius = 0;
    self.contentView.layer.masksToBounds = YES;
    self.contentView.backgroundColor = [UIColor clearColor];
    self.viewContainer.backgroundColor = [UIColor clearColor];//[UIColor clearColor];
    self.backgroundColor = [UIColor clearColor];
}

- (void)setRanking:(CGFloat)ranking {
    self.viewRate.rate = ranking;
}

- (void)setLevel:(NSNumber*)level {
    self.lblLevel.text = [NSString stringWithFormat:@"Level : %@",level];
}

- (void)setLevel:(NSNumber*)level andRanking:(NSNumber*)ranking {

    if (level.integerValue > 0) {
        [self setLevel:level];
    }
    if (ranking.doubleValue > 0) {
        CGFloat rankingConverted = ranking.floatValue;
        [self setRanking:rankingConverted];
    }
}


@end

И вот как вы используете его в вашем контроллере вида

LevelAndRankDetails* toolTipCustomView = [[LevelAndRankDetails alloc] initWithFrame:CGRectMake(0, 0, 250, 66)];
    toolTipCustomView.backgroundColor = [UIColor blackColor];
    [toolTipCustomView setLevel:@(10) andRanking:@(3)];
...