2011-01-27 5 views
15

ちょっとした背景:私はCS193P iTuneのビデオを見ていますが、私は最も長い間割り当て3に固執していました。基本的には、画面上に図形を表示するためのカスタム表示をプログラムで作成するように指示されています。私は途中でビューコントローラを使用していません。IOSでプログラムでビューを作成する(どのように機能するのですか?)

最終的にInterface BuilderでViewオブジェクトをドラッグしてオブジェクト名をカスタムビュークラスに変更するまでは、私のビューを表示できませんでした。だから私の質問は、人々がプログラムでビューを作成すると言っている、彼らは単に手動でクラスを作成すると言っているが、あなたはそれを表示する必要がIBを使用する必要がありますか?私は何かを誤解したような気分を助けることができないのですか?

編集:もっと明確にしてください。私のカスタムビューは、0,0,200,150のフレームで初期化されており、drawRectは、その中に正方形を描画するためにオーバーライドされています。試しに私のコントローラ内のメインウィンドウに追加する場合は私のビューにも表示されません:使用ドラッグはIBのビューとは、私のビュークラスにクラスを変更した場合

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

しかし、それは罰金を示しています。

編集:いくつかのコードを追加しました。これは私のコントローラの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

+0

AppDelegateクラスで作成されています。これは、#私のpolygonViewクラスをそこにインポートしてそこに作成する必要があるということですか? –

+0

面白いことに、私の初期化を行い、私のビューを私のupdateInterfaceメソッドのウインドウに追加すると、それは動作しますが、メソッドを呼び出すボタンをクリックした後です。コードがawakeFromNibのプロセスではないようです。何か案は? –

答えて

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; 

幸運!

+0

私は間違ったことをする必要があります。私はあなたが書いたとおり正確にそれを持っており、私の意見は表示されていません。 –

+0

Hmmm ... drawRectをコメントアウトするか、具体的には[self drawRect];でinitWithFrameで呼び出すとどうなりますか? –

+0

drawRectをオーバーライドしないと何も変わりません。 "reason: ' - [PolygonView drawRect]:インスタンス0x4b58c70に送信されたセレクタが認識されませんでした。" –

2

サブビューを追加するには、ビュー(またはウィンドウ)が必要です。あなたはUIViewのを継承するカスタムオブジェクトを持っている場合、あなたは代わりのUIViewのものを使用することになり、もちろん

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

:通常の構文は次のようです。新しいプロジェクトを開始するときは、ビューベースのアプリケーションを作成します。これは、関連するビュー(「CustomViewController.view」でアクセスできます。これはコードスニペットの「mainView」に置き換わります)上記)。

アプリケーションを開始するときにプログラムでビューを作成する場合は、ビューコントローラの「 - (void)viewDidLoad」メソッドにコードを挿入します。

+0

私は、View Controllerが行く方法を知っていますが、この特定の割り当てでは、モデルクラスは1つ、コントローラクラスは1つ、カスタムビュークラスは1つだけです。メインウィンドウにビューオブジェクトを追加する必要があると言っていますか?どのように、私はそれをやりますか? –

0

アクティブなコントローラクラスのどこかで、現在のトップレベルビューにカスタムビューを追加できます。

[ myCurrentTopView addSubview: myNewCustomView ]; 

このカスタムビューを最初に割り当てて初期化することをお勧めします。

次に、あなたが実行してこのカスタムビューののdrawRectで、いくつかの図面をトリガすることができます

[ myNewCustomView setNeedsDisplay ]; 
+0

現在のトップビューがメインウィンドウです。メインウィンドウはコントローラクラス内のオブジェクトではないので、私のビューをサブビューとしてどのように設定するのですか([window addSubView:...]は動作しません)。 –

0

ビューの背景色を区別できるものに設定しましたか?

あなたのビューが表示されないのですか、それとも見えないだけですか? NSLogをビューのdrawRect:メソッドに入れます(カスタムビュークラスを使用する場合)。

+0

はい、私は最初の背景色を黒に設定してみました。白または灰色の表示が表示されますが、表示されませんでした。私はまた、コンソールに表示されなかったdrawRectとiniWithFrameにNSLogメッセージを入れました。 polygonView = [polygonView initWithFrame:CGRectMake(0、10、320、480)]があっても私のビューが初期化されているとは思わない。私のコントローラのawakeFromNibメソッドで。 –

+0

私は初期化していないビューについてそれを取ります。これがあり、iniWithFrameのNSLogメッセージが表示されています。 drawRectのNSLogメッセージが表示されないだけです。モデルのデータが正しくビューに渡されていることがわかります。私はなぜウィンドウが私の意見を表示しないのか理解できません。 –

+0

もう少しコードを入力すると、状況を分析するのに役立ちます。 – fzwo

4

これは古い質問ですが、私は彼が予想される答えを得わからない - 彼は私がUIViewControllerサブクラスを作成したところ、私がやった同じ問題に遭遇したように聞こえる、インターフェイスビルダーのペン先でUIViewControllerをフラフラが、二人が互いに働く方法を理解できなかった。

あなたがあなたのクラスの横にあなたのために作られていないので、ペン先を別に作成した場合は、インターフェイスビルダに配置したUIViewControllerをクリックしてから、プロパティパネルから3番目のタブボタン( 'カスタムクラス')。 Classはデフォルトの基本クラスUIViewControllerなどになります。このドロップダウンリストを開くと、すべてのカスタムサブクラスのリストが表示され、それを選択してvolla - カスタム要素をインターフェイスにリンクしました。

私が理解するのに苦労した日々を節約したいという希望、私は単純な解決策を実現するまで、周りを回るいくつかの愚かな素晴らしい方法を見つけました。

0

私は最近非常に似た問題を抱えていました。 Xcode 4.3.2で「空のアプリケーション」を起動すると、ビューをルートビューとして設定する必要があります。 addSubviewの代わりにsetRootViewControllerメソッドを使用します。したがって:

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

その後、追加のビューを追加するためにaddSubviewメソッドを使用できます。ボディ:

2

ハイテクだけ、のdrawRectでカスタムコードの前に

[window bringSubviewToFront:polygonView]; 

right after, 
[window addSubview:polygonView]; 
+1

これは悪い習慣です.... – Resty

0

コール

[super drawRect]; 

をこのコードを追加します。