[英]help understanding interaction between UIVIewController and UIView subclass
[英]Need help in understanding programmatically created UIView and UIViewController
我一直在试图了解View Controllers和Views,即使在观看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文件创建视图。
谢谢,
凯文
从文档:
您的loadView方法的自定义实现不应调用super。
因此,摆脱[super loadview]
,它应该可以工作;)
另外,如果要使用自定义视图( UIView
子类)。 使用initWithFrame:
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
声明/定义,而不是在UIView
声明/定义。 如果您不进行投射,则会收到警告,但它会起作用。 在//2
您不需要setBackgroundColor:
转换,因为setBackgroundColor:
是UIView
类中定义的方法;)
Objective-C非常灵活,可以进行很多转换,因此您必须要小心,因为转换就像告诉编译器:“相信我,不是UIView,而是MyVIew”,编译器将服从您。 但是,如果您输入错误,则尝试调用doSomething:
时,应用程序将崩溃,因为UIView
中不存在该应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.