2010-02-04 2 views
1

EDIT: Этот вопрос объясняется большим отсутствием понимания того, как работает интерфейс Builder и свойства в классах.Настройка subview в UIViewController

Почему я не могу установить 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 

} 

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

+0

К сожалению, у меня не было достаточно ясно. В interfacebuilder как subview для self.view у меня есть mySubView. Он подключен как IBOutlet к свойству, установленному в контроллере. как вы можете видеть в заголовке. – hfossli

ответ

2

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

- (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 
} 
+0

Смарт, но не то, что я имел в виду. Я хочу установить конкретное subview, которое удерживает self.view. – hfossli

+0

Вы имеете в виду, что у вас есть какой-либо вид на вашем представлении UIViewController, и вы хотите заменить этот вид (из IB) на другой вид из кода? Как я понимаю, вам нужно сделать: 1. сохранить текущий view.frame: CGRect mySubViewFrame = [mySubView frame]; 2. удалите и поместите новое подвью - я написал, как это сделать 3. установите новый кадр для нового представления: [mySubView setFrame: mySubViewFrame]; – beefon

+0

много жонглирования, но приемлемо. Я не нажимаю «соглашаюсь», поскольку надеюсь на объяснение того, почему или простое решение, но собираюсь придерживаться твоего сейчас. спасибо – hfossli

-1

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

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

в заголовке, и использование:

@synthesize subview; 

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

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

+0

Я действительно не вижу разницы между тем, что вы написали и что я написал .. если разница, не могли бы вы объяснить? – hfossli

+0

Ну, я разрабатывал свой собственный поворот. Если он примет ваш, то я удалю свой ответ – Jaba

0

В ответ на то, что сказал @beefon. Это работает как ожидалось, но фоновый цвет прозрачен. Он doesen't реагировать либо ... кнопки не получить нажата и т.д ..

- (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]; 
} 
1

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

self.mySubview = anotherView; 

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

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

view (parent of) mySubview (parent of) anotherView 

Однако при назначении anotherView непосредственно к зрения, Вы не только изменить объект UIView вид имел в виду, но он также добавляет себя в 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

Я буду давать ему вращение в понедельник. большое спасибо! выглядит как правильное решение. – hfossli

+0

И какая разница между этим решением и моей? – beefon

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