2011-04-23 6 views
2

현재 네트워크 연결에서 메시지를받을 때마다 NSViews 및 NSTableViews를 수정해야하는 코코아 네트워크 클라이언트를 만들고 있습니다.비 그래픽 이벤트 이후보기 새로 고침

연결에서 메시지를 가져올 때마다보기를 새로 고치는 것 외에는 문제가 없습니다. 효과없이 NSTableView에 [tableView reloadData]을 시도했습니다. [view setNeedsDisplay:YES], [view setNeedsDisplayInRect:], [itsSuperView setNeedsDisplay:]을 시도했지만 어느 것도 작동하지 않았습니다.

사용자가 버튼을 클릭 할 때 reloadData 또는 setNeedsDisplay을 호출하면 개체보기 및 tableView가 올바르게 IB와 연결됩니다. setNeedsDisplay 또는 reloadData이 GUI에 의해 트리거 된 메소드에서 호출되지 않을 때 쓸모 없다 ...

어떤 힌트가 있습니까? 그것은 ... 어떤 적절한 해결책을 찾지 못하고 감사

--edit

나는이 문제를 데 며칠이되었습니다 : 여기에 코드

@implementation myWindowController 
- (id)init{ 
    self = [super initWithWindowNibName:@"ListWindow"]; //Form ListWindow.xib 
    return self; 
} 

- (void)windowDidLoad 
{ [super windowDidLoad]; 
} 


//From button in the GUI 
- (IBAction)refresh:(id)sender{ 
    [tableProcessus reloadData]; //Actually refreshes the tableView 
} 


//Form network 
- (void)handleIncomingText:(NSString *)str{  
    if([str isEqualToString:@"add an item"]){ 
     [glob addItem:3];   //glob is a custom array 
     [tableProcessus reloadData]; //Does nothing visible (doesn't even trigger numberOfRowsInTableView:) 
    } 
} 


#pragma mark tableProcessus Data source 
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView{ 
    return [glob numberOfItems]; 
} 

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex{ 
    return [glob itemAtIndex:rowIndex]; 
} 

@end 
+0

목적 : 여기

메소드에 대한 링크입니까? 백그라운드 스레드를 사용하고 있습니까? –

+0

사실, 나는'reloadData' 메시지를 직접 테이블 뷰로 보낼 것이다. 그리고 메인 스레드 (여기서'[NSThread isMainThread]'return'YES') ... – Daladim

+0

어떤 객체가'reloadData'를 보내고 있습니까? 네트워크 메시지 수신기? 다른 컨트롤러? 이 버튼은 버튼을 눌렀을 때'reloadData'를 보내는 것과 같은 객체입니까? 해당 개체가 네트워크 메시지 수신자를 소유하고 있습니까? 내가 묻는 것은 메시지 수신기 객체와'reloadData' 호출 사이의 관계는 무엇인가? –

답변

0

메인 스레드에서 setNeedsDisplay:를 호출 무엇입니까?
그렇지 않다면, 당신은 그렇게해야합니다 http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-123427

+0

불행히도, 그렇습니다 ... 저는 정말로 그것을 얻지 못했습니다 ... – Daladim

+0

George Sachin이 게시 한 것처럼 performSelectorOnMainThread :를 사용하십시오. 업데이트를 게시해야 게시 할 수 있습니까? –

0

을 당신은 메인 스레드는 NSView의보기를 변경할 수 있기 때문에 performSelectorOnMainThread:withObject:waitUntilDone:

그게 전부를 사용하는 것 같아요. SetNeedsDisplay 등은 작동하지 않습니다. 메인 스레드에서 뷰를 변경하는 메소드를 작성하고 선택기를 사용하여 호출해야합니다. 테이블 뷰에 유출구를 갖는 메시지를 수신 performSelectorOnMainThread:withObject:waitUntilDone:

+0

유감스럽게도, 네트워크 이벤트는 메인 스레드에서 이미 처리되고 있습니다. (WindowController는 네트워크의 델리게이트이고'[NSThread isMainThread]'는'YES'를 반환합니다) ... 나는 당신이 제안한 것을 시도했지만 도움이되지 않았습니다. : - / – Daladim

관련 문제