2011-07-12 8 views
2

私はコードページを投稿せずに何をしているのかを知るために、私はNSOperationを持っています。そのNSOperationでは、NSNotificationCenterを使用して、新しいジョブが開始されるたびにNSViewに通知を送信します。新しいサブビューを追加して、ちょうど開始した仕事に関する情報を私に提供したいと考えています。問題は、新しいサブビューを描くようには見えないということです。ここに私が今いるものがあります。その後、NSViewとその中でのサブビューのロード

-(void) newJobNotification: (NSNotification *) notification 
{ 
    if (!jobViewArray) 
      jobViewArray = [[NSMutableArray alloc] init]; 
    ++jobCount; 
    NSRect rect; 
    rect.size.width = 832; 
    rect.size.height = 120; 
    NSPoint point = { 0, ((jobCount * 120) - 120) }; 
    rect.origin = point; 
    ProgressView *newJob = [[ProgressView alloc] initWithFrame:rect]; 

    [jobViewArray addObject:newJob];  
    NSLog(@"Notice Count %i", [jobViewArray count]); 

    } 

} 

私は仕事を追加するために私のアプリを使用する場合は、通知が適切に私のNSViewによって受信され、サブビューが適切jobViewArrayに追加されますが、とき:

ダウン
- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSLog(@"Draw Count %i", [jobViewArray count]); 
    int i = 0; 
    while (i < [jobViewArray count]) { 
     [self addSubview:[jobViewArray objectAtIndex:i]]; 
    }  

} 

し、さらにdrawRect:が再び呼び出されました。jobViewArrayは空です。私がこれのようなことをやろうとしたのは初めてのことなので、私はおそらくここで何か完全に間違っているでしょう...それはうまくいきませんので、

+0

通知内のjobViewArrayカウントのlogステートメントは、あなたが期待するものを示していますか? jobViewArrayはプロパティですか? – sosborn

+0

通知メソッドでは、logステートメントは1のカウントを返しますが、後でdrawRectは0を返します。jobViewArrayは、次の定義を持つプロパティです。@property(readwrite、copy)NSMutableArray * jobViewArray; – Kris

+0

通知そのログ文を一番上に置きます。それが現在のところでは、少なくとも1つは常に返されます。なぜなら、あなたが作成したjobViewArrayを作成しないと、それを作成してしまうからです。また、イアンはそうです、drawRectでビューを追加するべきではありません。 – sosborn

答えて

1

drawRect:のビューにサブビューを追加しないでください。通知を受け取ったら、2回目の通知が来るので、そこにサブビューを追加する必要があります。2つのサブビューを追加し、次に3つのサブビューを追加します。

通知にサブビューを追加すると、配列を混乱させる必要はありません。

+0

私はdrawRectにそれを追加しようとしていました。なぜならどこかで、drawRect:以外のビューを描画しないでください。私は実際に通知が呼び出されるたびに、新しいサブビューが必要です。サブビューの更新については、私は別の通知を行うつもりでした。私は先に進み、通知に '[self addSubview:newJob]'を入れましたが、それでもサブビューを描画しません。私は、私が手動でdrawRectに入れると、サブビューのコードが動作することを知っています。サブビューを開くとすぐにサブビューをウィンドウに追加するからです。 – Kris

+0

OK、追加情報私は自分のjobViewArrayを取り除きました。私の通知では、今は '[self addSubview:newJob]'とNSLog(@ "After Count%i"、[[self subviews] count]) 'を持っています。私がdrawRectで同じログステートメントを呼び出すと:それは私に0個のサブビューを持っています。私はあなたのサブビューが私の通知とdrawRectの間で消えている理由を理解していません:... – Kris

+0

addSubviewを呼び出すと、それはサブビューを描画していません。サブビューは描画する必要があるときにdrawRect:を呼び出すことができます。あなたの通知は別のスレッドか何かから呼び出されていますか?そうであれば、[self performSelectorOnMainThread:withObject:waitUntilDone:]を使用して、実際のaddSubviewを行う新しいメソッドを作成する必要があるかもしれません: – iain

関連する問題