簡體   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