繁体   English   中英

在理解以编程方式创建的UIView和UIViewController时需要帮助

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM