2012-04-16 22 views
41

在ViewController中,有ViewDidLoad當VC加載就知道了。的iOS viewDidLoad中進行的UIView

對於一個UIView,我有什麼方法視圖加載時使用?

這個方法是否會被任何init調用?

編輯: 沒有XIB,只是編程。

+0

取決於你來自哪裏,裝好了... – borrrden 2012-04-16 01:24:15

+0

喜謝謝,我加載視圖從viewController – MaKo 2012-04-16 01:26:03

回答

-6

它並不像這樣工作。

- (void)viewDidLoad當視圖控制器被加載不被調用;它在視圖控制器的視圖被加載時被調用。

所以,你可以創建的UIViewController,以及將被調用的唯一方法是用於初始化它的初始化方法。該視圖將不會被創建時, - (無效)viewDidLoad方法不叫,等

然後,當別的詢問其視圖,視圖控制器,通過:

viewController.view; 

視圖控制器然後調用:

- (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here. 

其次:

- (void)viewDidLoad; 

查看有沒有負載是一個單獨的方法,這樣你就不會必須中斷實際的loadView方法和複雜的視圖加載選項。如果開發人員不確定Apple正在做什麼以及他們的最佳實踐是什麼,那麼在使用nib等時子類化和重寫loadView方法可能會導致問題,因此Apple將這種方法分開是明智的。

然後,當內存警告而來的觀點被釋放,並設置爲nil:

- (void)viewWillUnload; 
// view unloaded and set to nil. 
- (void)viewDidUnload; 
+54

這就是它如何在uiviewcontroller工作不UIView ... – ngb 2013-12-26 11:11:30

+3

這個答案並不完全反映問題的點...提問者不需要視圖控制器。 – 2016-04-01 08:14:27

+1

正確的答案在這裏http://stackoverflow.com/a/4502761/2757496 – kaushal 2016-11-17 11:46:11

30

如果從XIB文件中加載它,當它從XIB加載的awakeFromNib方法將被調用。

編輯在沒有XIB的情況下,你可能會使用來自觀測查看相關的變化面積the docs的方法之一(例如,didMoveToSuperview)它來推斷。不過,更好的方法是在viewDidLoad方法中從視圖控制器向視圖發送消息。

+0

嗨,感謝您將編輯我的問題,沒有XIB,ju st編程式 – MaKo 2012-04-16 01:27:54

+0

優秀答案,絕對正確! – myusuf3 2014-09-18 17:34:03

+0

如果UIView重新加載,它會再次觸發嗎? – dumbledad 2016-06-17 14:42:03

0

據我所知,我不認爲有除了初始化這種方法。通常我會在init方法中進行準備。您可以創建自己的viewDidLoad方法並手動調用它。但大多數情況下,UIView由其視圖控制器管理,因此視圖控制器應該知道視圖何時加載,如果要配置視圖,可以在視圖控制器中進行。順便說一下,並不總是調用viewDidLoad方法。

+5

我從來沒有見過'viewDidLoad' * not * called。在什麼情況下不會被稱爲? – devios1 2013-10-25 19:17:49

2

我有類似的問題,發現相對容易的解決方案。想法是在合適的時間將viewDidLoad發送到每個子視圖,並在您感興趣的類上重載該方法。

爲此,請在您的課程中添加這部分代碼...

// UIViewController 
- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    [self.view viewDidLoad]; 
} 


// UIView+Loading.m 
#import < UIKit/UIKit.h> 

@implementation UIView (Loading) 

- (void)viewDidLoad 
{ 

    for (UIView* subview in self.subviews) 

     [subview viewDidLoad]; 
} 

@end 


// UIView+Loading.h 
#import < UIKit/UIKit.h> 

@interface UIView (Loading) 

- (void)viewDidLoad; 

@end 


// UIView_CustomImplementation 

- (void)viewDidLoad 
{ 

    NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called"); 

} 
7

實際上,對於您的視圖的初始化,您沒有對視圖控制器的方法viewDidLoad()做任何事情。所有你想要做的,你可以在視圖的init方法中做。 例如,在視圖控制器的viewDidLoad(),有一些初始化代碼:

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    // init your parameters here 
} 

類似,在您看來的init方法:

- (id)initWithDelegate:(id)_delegate 
{ 
    self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain]; 
    if (self) { 
     [super init]; 

     self.delegate = _delegate; 

     // init your parameters here 

     return self; 

    } 
    return nil; 
} 

然後,從視圖這樣的控制器創建YourView:

YourView view = [[YourView alloc] initWithDelegate:self]; 
[self.view addSubview:view]; 
[view release]; 

此外,要做到當你的觀點做了工作負荷,可以在layoutSubviews方法放置在您看來,像這樣的事情:

-(void)layoutSubviews{ 
    [super layoutSubviews]; 

    // init your parameters here, like set up fonts, colors, etc... 
} 

我想,這是你所需要的。

乾杯!

4

斯威夫特2:

import UIKit 

class myView: UIView { 

    override func layoutSubviews() { 
    print("run when UIView appears on screen") 
    // you can update your label's text or etc. 
    } 
} 
+1

這與Swift 2無關。它是基於約束的佈局的重寫點。引用框架中的註釋:「覆蓋點,由layoutIfNeeded自動調用。從iOS 6.0開始,當使用基於約束的佈局時,基礎實現應用基於約束的佈局,否則它什麼也不做。 – 2017-01-09 14:23:25

+2

警告:layoutSubviews可以多次觸發,當然不是做任何設置代碼的地方(比如viewDidLoad) – 2017-09-14 20:31:39

1

您可以使用willMove(toSuperview newSuperview:UIView的)

import UIKit 

final class myView: UIView { 

    override func willMove(toSuperview newSuperview: UIView?) { 
    //Do stuff here 
    } 
} 

Apple Docs