2011-01-27 55 views
15

稍微背景:我正在瀏覽CS193P iTune視頻,並且我在作業3上停留時間最長。基本上,分配會要求您以編程方式創建自定義視圖以在屏幕上顯示形狀。順便說一下,我沒有使用任何視圖控制器。以編程方式在IOS中創建視圖(它是如何工作的)?

我無法讓我的視圖顯示,直到我終於在Interface Builder中拖動一個View對象,並將對象名稱更改爲我的自定義視圖類。所以我的問題是,當人們說以編程方式創建一個視圖,他們只是說手動創建類,但是當你需要顯示它使用IB?我不禁感到我誤解了某些東西?

編輯:讓我更清楚。我的自定義視圖已用0,0,200,150幀初始化,並且drawRect被重寫以在其中繪製方形。我的看法甚至不顯示了,如果嘗試我的控制器內將其添加到主窗口:

UIWindow* window = [UIApplication sharedApplication].keyWindow; 
[window addSubview:polygonView]; 

但是,如果使用拖放在IB的視圖,並更改類到我的視圖類,它顯示了罰款。

編輯:添加了一些代碼。這是我的控制器的awakeFromNib方法,應該繪製視圖。我控制器updateInterface方法

- (void)awakeFromNib { 
    shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12]; 
    polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    UIWindow *window = [UIApplication sharedApplication].keyWindow; 
    polygonView.backgroundColor = [UIColor blackColor]; 
    [window addSubview:polygonView]; 
    [self updateInterface]; 
} 

部分:

- (void)updateInterface { 
    [polygonView setPolygon:shape]; 
    [polygonView setNeedsDisplay]; 
... 
} 

PolygonView.h

#import <UIKit/UIKit.h> 
#import "PolygonShape.h" 

@interface PolygonView : UIView { 
    IBOutlet PolygonShape *polygon; 
} 

@property (readwrite, assign) PolygonShape *polygon; 

- (void)drawRect:(CGRect)rect; 
@end 

PolygonView.m

#import "PolygonView.h" 

@implementation PolygonView 
@synthesize polygon; 

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 
     nslog(@"initialized"); 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
     CGRect bounds = [self bounds]; 

    [[UIColor grayColor] set]; 
    UIRectFill(bounds); 

    CGRect square = CGRectMake(10, 10, 10, 100); 
    [[UIColor blackColor] set]; 
    UIRectFill(square); 

    [[UIColor redColor] set]; 
    UIRectFill(square); 
    NSLog(@"drawRect called"); 
} 
@end 

的polygonView正在初始化,但ISN的drawRect不會被打擾d。

+0

keyWindow在哪裏被創建?如果你沒有加載nib文件(從你的問題中不清楚你是否是),那麼在添加子視圖之前,你必須先創建窗口。 – jlehr 2011-01-27 22:24:14

+0

它正在AppDelegate類中創建。這是否意味着我必須#import我的PolygonView類並在那裏創建它? – 2011-01-28 05:13:22

+0

有趣的是,如果我把我的視圖的初始化和添加到我的updateInterface方法的窗口,它的工作原理,但只有當我點擊一個調用該方法的按鈕後。看起來好像代碼不在awakeFromNib中進行處理。有任何想法嗎? – 2011-01-28 18:44:24

回答

16

爲了更加具體到你的問題,語法將

UIWindow* window = [UIApplication sharedApplication].keyWindow; 

UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 200, 150)]; 
//add code to customize, e.g. polygonView.backgroundColor = [UIColor blackColor]; 

[window addSubview:polygonView]; 
[polygonView release]; 

這是一個你不僅可以使用這種模式,還可以使用子模式。另外,還有很多模板,viewController已經設置了它自己的視圖。當你想自定義視圖,你喜歡在其上創建,而是方法的上方設置了viewControllers查看到新創建的視圖,像這樣:

viewController.view = polygonView; 

祝你好運!

2

您需要有一個視圖(或窗口)來添加子視圖。正常的語法是這樣的:

UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds]; 
[mainView addSubview:newView]; 
[newView release]; 

當然,如果你有一個從UIView的繼承的自定義對象,你會用這個來代替的UIView。當你開始一個新項目時,創建一個「基於視圖的應用程序」,它將使用一個帶有關聯視圖的視圖控制器來啓動你(可以用「CustomViewController.view」來訪問它,它將替換代碼片段中的「mainView」以上)。

如果您想在應用程序啓動時以編程方式創建視圖,請將代碼放置在視圖控制器的「 - (void)viewDidLoad」方法中。

+0

我知道一個視圖控制器將會走的路,但在這個特定的任務中,只有一個模型類,一個控制器類和自定義視圖類。你是說我必須將我的視圖對象添加到主窗口?我將如何以及在哪裏做到這一點? – 2011-01-27 18:18:48

0

在您的活動控制器類中的某處,您可以將自定義視圖添加到當前頂級視圖。

[ myCurrentTopView addSubview: myNewCustomView ]; 

它有助於首先分配和初始化此自定義視圖。

然後,您可以通過觸發該自定義視圖的drawRect一些繪圖一個:

[ myNewCustomView setNeedsDisplay ]; 
0

您是否將視圖的背景顏色設置爲可區分的?

您確定您的視圖不顯示嗎​​?還是僅僅是您看不到它?將NSLog放入視圖的drawRect:方法中(如果使用自定義視圖類)。

4

這是一個古老的問題,但我不確定他是否得到了他期望的答案 - 這聽起來像是他遇到了我在創建子類時所遇到的同樣問題,在界面構建器筆尖中敲了一個UIViewController但然後無法弄清楚如何讓兩個人一起工作。

如果你單獨製作了筆尖(所以它不是爲你和你的班級一起製作的),那麼你必須記住點擊你放置在界面生成器中的UIViewController,然後從屬性面板中點擊第三個標籤按鈕('自定義類')。 Class將作爲默認基類UIViewController等 - 只需打開此下拉列表,您將看到所有自定義子類的列表,選擇它和volla - 您已將自定義元素鏈接到界面。

希望能夠拯救某些人,讓我瞭解這些日子,我找到了一些愚蠢的奇妙方式來解決它,直到我意識到簡單的解決方案。

0

最近我有一個非常類似的問題,這裏是我的工作: 看來,當在Xcode 4.3.2中的一個'空應用程序'開始,你必須設置你的視圖作爲根視圖你的主窗口使用setRootViewController方法代替addSubview。所以:

// Initialize myView and then 
[window setRootViewController:myView]; 
// instead of [window addSubview:myView]; 
// the rest as normal... 
[window makeKeyAndVisible]; 

之後,您可以使用addSubview方法來添加其他視圖。

2

喜只需添加此代碼,

[window bringSubviewToFront:polygonView]; 

right after, 
[window addSubview:polygonView]; 
0

呼叫

[super drawRect]; 

在drawRect中您的自定義代碼之前:身體。

相關問題