2013-10-24 3 views
0

Это смехотворно глупый вопрос, но у меня проблемы с ним. Я создал один .xib с тремя UIView в нем. Один зеленый вид, один красный вид и один синий вид. Зеленый экран отображается, когда я запускаю симулятор. Я положил 2 кнопки на свой «Зеленый взгляд». Один, чтобы показать «Красный вид», а другой - «Голубой взгляд». Вот мой код для Green View:Objective-C заменить текущий UIView на другой UIView

#import "IDGreenView.h" 
#import "IDRedView.h" 
#import "IDBlueView.h" 
#import "IDGreenView.h" 

@interface IDGreenView() 
@property (weak, nonatomic) IBOutlet UIButton *RedViewButton; 
@property (weak, nonatomic) IBOutlet UIButton *BlueViewButton; 

@end 

@implementation IDGreenView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 
- (IBAction)showRedView:(id)sender { 
    [self.window addSubview:[[IDRedView alloc]init]]; 
} 
- (IBAction)showBlueView:(id)sender { 
    [self.window addSubview:[[IDBlueView alloc]init]]; 
} 

@end 

Вот мой код для Red Вид:

#import "IDRedView.h" 

@implementation IDRedView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

@end 

Я могу видеть, что это происходит в Красной View в методе initWithFrame, так что я знаю, что вызов ОК. Что мне нужно сделать, чтобы отобразить Red View?

спасибо.

---------------------------------------------- ---- Обновленный комментарий ------------------------------------------ --------

Nope. Я поставил следующий код в ViewController, и это тоже не сработало.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    [self.view addSubview:[[IDRedView alloc] initWithFrame:self.view.bounds]]; 
} 

Почему это не отображается?

ответ

1

С кратким взглядом ваш красный вид не является «красным», как вы могли бы предположить.

Вы говорите, что создали 3 вида в ОДНОМ xib, но я вижу, что они определены в 3 файлах. Красное представление, которое вы вызываете при вызове [IDRedView alloc] init], не является тем, которое вы создали в xib. Таким образом, он не «красный».

У вас действительно должно быть 3 xib для трех видов, если вы хотите выделить их так, но тогда вам нужно будет использовать initWithNibName: выделить их.

Чтобы увидеть, что ваши добавления мнения правильно и что вы не сумасшедший:

Попробуйте это, в красном зрения -

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     self.backgroundcolor = [UIColor redColor]; 
    } 
    return self; 
} 
2

Я вижу две основные проблемы с кодом:

Во-первых, почему вы добавляете взгляд в окно? [self.window addSubview...]. Если IDGreenView подкласс UIView вы должны только сказать: [self addSubview...]

Во-вторых, вы создаете IDRedView и IDBlueView без рамы (опять же, при условии, что они оба подклассы UIView). Попробуйте создать их с помощью рамы, например:

// You may have to adjust the frame to fit your needs 
[[IDRedView alloc] initWithFrame:CGRectMake(0,0,20,20)]; 

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

1

Вместо self.window попробуйте использовать только self. Но в этой ситуации вы фактически не заменяете представление, которое вы создаете, и помещаете его в текущее. Поэтому, если вы продолжаете это делать, в итоге вы получите десятки вложенных представлений.

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

- (IBAction)showRedView:(id)sender { 
    [self addSubview:[[IDRedView alloc] initWithFrame:self.bounds]]; 
} 

Вышеупомянутая реализация полностью скроет ваш текущий вид и просто покажет новый.

Смежные вопросы