2013-04-10 2 views
0

Я использую что-то вроде:
VC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];инстанцировании View Controller из кода - Когда viewDidLoad называется IOS

viewDidLoad пока не называется.
Но когда я делаю:
VC.view.frame = CGRectMake(...);

На данный момент viewDidLoad называется.

Но проблема в том, что размеры представления, которые я передаю в приведенном выше кодексе, не используются в методе viewDidLoad.
Я думаю, он видит, что этот вид используется, поэтому пришло время загрузить представление, и после загрузки представления он должен назначать размеры кадра для представления. Но что, если я хочу, чтобы размеры вида, поставленные перед viewDidLoad вызываются, так что я могу использовать эти измерения в методе viewDidLoad ..
Что-то вроде initWithFrame..

Кроме того, у меня нет размеров просмотра в контроллере представления , Я должен назначить размеры вида вне VC.
Возможно, после вызова метода initWithNibName:bundle: я могу сохранить размеры рамки вида в некоторой переменной .. но это не похоже на чистое решение, не так ли?

+2

В вашем ConfigurationViewController вы можете создать новый метод init, который принимает объект CGRECT. – JDx

+0

@JDx о да! конечно, должно работать – neeraj

+0

Даже тогда, viewDidLoad не будет иметь новых измерений. Всякий раз, когда я попытаюсь назначить новые измерения, он сначала загрузит представление, а затем назначит измерения – neeraj

ответ

2

Вы можете сделать что-то вроде этого:

В интерфейсе

@interface SettingsViewController : ... { 
    CGRect _initialFrame; 
} 

... 

- (id)initWithFrame:(CGRect)frame; 

@end 

В реализации

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     _initialFrame = frame; 
    } 

    return self; 
} 

- (void)viewDidLoad 
{ 
    self.view.frame = _initialFrame; 

    [super viewDidLoad]; 
} 

, а затем из класса вы используете этот контроллер:

VC = [[SettingsViewController alloc] initWithFrame:CGRectMake(...)]; 
+0

Да, это то, о чем я упоминал, и это кажется лучшим выходом. – neeraj

3

viewDidLoad вызывается, когда вид загрузился. (сюрприз)

поэтому к тому времени, как вы позвоните VC.view, перед тем, как он вернется, будет выполнен viewDidLoaded, после чего появится представление и установите рамку.

так от текущего подхода, не представляется возможным

в любом случае, поэтому вам нужно просмотр кадра в viewDidLoad? может быть, вы можете переместить эту часть в viewWillAppear/viewDidAppear который только дозвонились, когда представление собирается представить

+0

В настоящее время я делаю это только – neeraj

+0

@neeraj делает что? это любая причина, по которой вы должны знать рамку представления в 'viewDidLoad' и не можете переместить этот код в' viewWillAppear'/'viewDidAppear' –

+0

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

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