Настройка подпредставления в UIViewController - PullRequest
1 голос
/ 04 февраля 2010

РЕДАКТИРОВАТЬ: Этот вопрос из-за большого непонимания, как Interface Builder и свойства в классах работают.

Почему я не могу просто установить self.mySubView = anoterhView;, как можно установить self.view = anotherView;?

## .h
@interface TestController : UIViewController {
    IBOutlet UIView *mySubView;
}

@property (nonatomic, retain) IBOutlet UIView *mySubView;

##.m

@implements TestController

@synthesize mySubView;

- (void)viewDidLoad { 

    AnotherController *anotherController = [[AnotherController alloc] initWithNibName:nil bundle:nil];
    anotherView = anotherController.view;

    // if i do
    self.view = anotherView;
    // result: replaces whole view with anotherView

    // if i instead do
    self.mySubView = anotherView;
    // result: no change at all

    // or if i instead do:
    [self.mySubView addSubview:anotherView];
    // result: mySubView is now displaying anotherView

}

ПРИМЕЧАНИЕ. Я использую интерфейсный строитель.Я уверен, что все правильно подключено, потому что self.view и self.mySubView addSubview: работают нормально ..

Ответы [ 4 ]

2 голосов
/ 04 февраля 2010

Чтобы он автоматически отображался на вашем self.view, вам необходимо перезаписать ваш метод установки, например ::10000

- (void)setMySubView:(UIView *)view {
    [mySubView removeFromSuperview];  // removing previous view from self.view
    [mySubView autorelease];
    mySubView = [view retain];
    [self.view addSubview: mySubView]; // adding new view to self.view
}
1 голос
/ 05 февраля 2010

mySubview - это свойство, которое является ссылкой на объект UIView. Поэтому, когда вы присваиваете ему UIView объект, вы просто изменяете то, на что ссылается mySubview , и не более, чем в этом случае,

self.mySubview = anotherView;

Исходный объект UIView, на который ссылался mySubview , все еще упоминается в свойстве view *1013* s subviews . Ничего не меняется.

Но когда вы добавляете anotherView в качестве подпредставления mySubview , anotherView относится к иерархии представлений и отображается на экране. Так что это работает.

view (parent of) mySubview (parent of) anotherView

Однако, когда вы присваиваете anotherView непосредственно представлению , вы не только изменяете объект UIView, на который ссылался view , но и добавляете себя в parentView. , Это обрабатывается UIViewController .

self.view = anotherView;



Ваш setCurrentView должен быть примерно таким,

- (void) replaceSubview:(UIView *)newView {
  CGRect frame = mySubview.frame;

  [mySubview removeFromSuperview];
  self.mySubview = newView;

  [self.view addSubview:newView];
  newView.frame = frame;
}



0 голосов
/ 05 февраля 2010

В ответ на то, что сказал @beefon.Это работает, как и ожидалось, но цвет фона прозрачный.Он также не отвечает ... кнопки не нажимаются и т.д ..

- (void)setCurrentView:(UIView *)newView {
    /*      1. save current view.frame: CGRect mySubViewFrame = [mySubView frame]; 
            2. remove and put new subview - I have wrote how to do it 
            3. set new frame for new view: [mySubView setFrame:mySubViewFrame];      */ 
    CGRect currentViewFrame = [currentView frame];
    [currentView removeFromSuperview];
    [currentView autorelease];
    currentView = [newView retain];
    [self.view addSubview:currentView];
    [currentView setFrame:currentViewFrame]; 
}
0 голосов
/ 04 февраля 2010

Ваша переменная экземпляра должна быть свойством, чтобы использовать точку.синтаксис, используйте:

@Property (nonatomic, retain) IBOutlet UIView* subview;

в заголовке и используйте:

@synthesize subview;

в основном файле.

Чтобы установить UIView, используя точку.синтаксис вам нужно сделать его свойством.Это также позволяет вам устанавливать свойства subview вне класса.

...