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

时间:2011-01-30 04:42:01

标签: iphone model-view-controller ios uiview uiviewcontroller

我一直在尝试理解视图控制器和视图,甚至在观看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文件创建视图。

谢谢,

凯文

1 个答案:

答案 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中您不需要强制转换,因为//2setBackgroundColor:类中定义的方法;)

Objective-C非常灵活,允许投射很多东西,所以你必须要小心,因为演员就像告诉编译器:“相信我,不是UIView,是MyVIew”,编译器会服从你。但如果您错了,那么在尝试拨打UIView时您的应用会崩溃,因为doSomething:中不存在该应用。