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