Dan*_*ani 37 iphone cocoa-touch objective-c uiviewcontroller
我对Mac和iPhone上的UI编程相当陌生,而且我遇到了一些让我感到困惑的事情.
UIViewController有3个方法,涉及它的初始化及其视图:
我希望这些按照上面的顺序发生.第一个UIViewController由其他一些对象分配,然后立即调用init(或其他一些init方法,如initWithStyle).
只有在初始化对象后,我才会期望它调用自己的loadView函数,之后视图加载后会调用viewDidLoad委托方法.
例如,这不会发生:
@implementation UIViewControllerSubclass
- (id)init {
NSLog(@"0");
if (self = [super init]) {
NSLog(@"1");
}
return self;
}
- (void)loadView {
[super loadView];
NSLog(@"2");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"3");
}
@end
Run Code Online (Sandbox Code Playgroud)
生成控制台输出:
0
2
3
1
Run Code Online (Sandbox Code Playgroud)
因此,loadView和viewDidLoad方法不能进行委托调用,因为委托通常在调用[super init]之后设置,在 loadView和viewDidLoad运行之后调用(如上所示):
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
Run Code Online (Sandbox Code Playgroud)
如果我想运行以某种方式设置ViewController的代码,通知代理,如果代码驻留在init方法中?loadView现有的原因是否允许在适当的时候运行此类代码?
在我看来,我必须创建一个新的initWithDelegate方法,该方法在调用[super init] 之前设置委托ivar ,这是对的,还是我以错误的方式进行此操作?
提前致谢 :)
小智 30
iPhone上的视图加载系统的工作方式如下:
初始化视图控制器时(使用-init或-initWithNibName:bundle :),它实际上不会创建和初始化视图.当你第一次调用-view时,它会调用-loadView.默认情况下,-loadView只从xib文件(nibName)加载视图.但是,如果重写此操作,则负责创建视图并将其分配给视图控制器的视图属性.举个例子:
- (void)loadView
{
UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
// add subviews
self.view = view;
[view release];
}
Run Code Online (Sandbox Code Playgroud)
每次创建视图时,视图都会变得可见并显示在屏幕上,它会调用-viewDidLoad.(-viewDidAppear/-viewDidDisappear用于屏幕上视图的可见性)
由于我们已经偏离轨道,让我们考虑一下内存管理.当视图在屏幕外时,系统会自动将视图控制器的视图属性设置为nil.问题是该视图的所有子视图都在泄漏.怎么会这样?好吧,每个子视图的保留计数为2(视图保留子视图,并且您的视图控制器有一个插座/ ivar).当视图为nil时,该视图的保留计数为1.如果视图未显示,则视图停留是没有意义的,因此在-viewDidUnload(它是一个挂钩)中将其设置为nil只要视图设置为nil).
ger*_*ry3 16
的initWithNibName:束:方法对于UIViewController类指定初始化.
尝试覆盖并使用它而不是init:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
...
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] initWithNibName:@"UIViewControllerSubclass" bundle:nil];
Run Code Online (Sandbox Code Playgroud)
Sau*_*lui 14
-(void)awakeFromNib
{
}
Run Code Online (Sandbox Code Playgroud)
只有当你使用故事板来存储故事板Nib中绘制的ViewController时才会被调用---意味着接口捆绑.
正确的顺序是
-(void)initWithCoder
-(void)awakefromNib //(if story board is used)
or
-(void)loadView----() //if manually generating the view contoller
-(void)viewDidLoad-----(called only once in the life cycle of viewController)
-(void)viewWillAppear
-(void)viewDidAppear
Run Code Online (Sandbox Code Playgroud)
在转移到新的ViewController时
-(void)viewWillDisappear
-(void)viewDidDisappear
Run Code Online (Sandbox Code Playgroud)
在返回第一个ViewController时
-(void)viewWillAppear
-(void)viewDidAppear
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45411 次 |
| 最近记录: |