Нужна помощь в понимании программно созданных UIView и UIViewController - PullRequest
0 голосов
/ 30 января 2011

Я пытался понять 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 в подклассах.

Спасибо

Кевин

1 Ответ

1 голос
/ 30 января 2011

Из документов:

Ваша пользовательская реализация 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...