我一直在尝试理解视图控制器和视图,甚至在观看iTunesU上的一些课程之后,我仍然在以编程方式实现它们时遇到一些麻烦。我希望有人能澄清一点。
所以我正在尝试创建一个UIViewController,然后创建它的视图。
该程序在以下类中分解: ProgramNameAppDelegate.h和.m ApplicationRootViewController.h和.m
从AppDelegate中,我创建了UIWindow和UIViewController。部分代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
_window = [ [UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
if (!_window)
{
[self release];
return NO;
}
_rootViewController = [ [ApplicationRootViewController alloc] init];
if (!_rootViewController)
{
NSLog(@"No _rootViewController");
[self release];
return NO;
}
[_window addSubview:[_rootViewController view]];
[_window makeKeyAndVisible];
return YES;
}
在ApplicationRootViewController中,我调用init。我的UIView是在loadView中创建的:
- (void)loadView
{
NSLog(@"In loadView");
[super loadView];
CGRect _frame = [[UIScreen mainScreen] applicationFrame];
UIView* _rootView = [[UIView alloc] initWithFrame:_frame];
[_rootView setBackgroundColor:[UIColor redColor]];
self.view = _rootView;
return;
}
我遇到的问题显然是程序正在创建视图,但是,在应用程序重新激活之前,它永远不会显示我创建的视图。一旦我离开应用程序并重新进入,视图就在那里。我尝试过其他一些东西,但它总是表现得一样。
我最终希望控制器从子类UIView.h和.m文件创建视图。
谢谢,
凯文
答案 0 :(得分:1)
来自docs:
loadView 的自定义实现 方法不应该叫超级。
所以,摆脱[super loadview]
它应该有效;)
此外,如果您想使用自定义视图(UIView
的子类)。 Alloc / Init使用initWithFrame:
,当从uiviewcontroller引用self.view时,你必须像这样强制转换它:
[(MyView *)self.view myMethod];
就这么简单;)
修改强> 假设你创建了这样一个类:
//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
中声明/定义而不是{{1} }}。如果你不投,你会收到警告,但它会起作用。
在UIView
中您不需要强制转换,因为//2
是setBackgroundColor:
类中定义的方法;)
Objective-C非常灵活,允许投射很多东西,所以你必须要小心,因为演员就像告诉编译器:“相信我,不是UIView,是MyVIew”,编译器会服从你。但如果您错了,那么在尝试拨打UIView
时您的应用会崩溃,因为doSomething:
中不存在该应用。