Из документов:
Ваша пользовательская реализация loadView
метод не должен вызывать super.
Итак, избавьтесь от [super loadview]
и все должно заработать;)
Также, если вы хотите использовать пользовательское представление (подкласс UIView
). Alloc / Init использует initWithFrame:
и при обращении к self.view из uiviewcontroller вам нужно будет привести его так:
[(MyView *)self.view myMethod];
Так просто;)
EDIT:
Предположим, вы создаете такой класс:
//MyView.h
@interface MyView : UIView{
...
}
- (void) doSomething:(NSString *)string;
@end
//MyView.m
#import MyView.h
@implementation MyView
... write your implementation here
@end
затем в UIViewController,
в loadView
делать:
//don't forget to #import "MyView.h"
-(void) loadView{
MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(...)];
self.view = (UIView *)myView;
[myView release];
}
затем при обращении к вашему представлению где-то еще в контроллере:
- (void) viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[(MyView *)self.view doSomething:@"something"];//1
[self.view setBackgroundColor:[UIColor greenColor]];//2
}
В //1
вы должны приводить, потому что вы вызываете метод doSomething:
(или это может быть также свойство), который объявлен / определен в MyView
, а не в UIView
. Если вы не сыграете, вы получите предупреждение, но оно сработает.
В //2
вам не нужно приводить, так как setBackgroundColor:
- это метод, определенный в UIView
class;)
Objective-C очень гибок и позволяет разыгрывать многие вещи, поэтому вы должны быть осторожны, потому что приведение похоже на указание компилятору: «Поверь мне, это не UIView, это MyVIew», и компилятор будет подчиняться тебе. Но если вы ошиблись, ваше приложение зависнет при попытке вызвать doSomething:
, поскольку оно не существует в UIView
.