2012-09-06 2 views
1

NSScrollView 안에 NSTableView가 있습니다. NSTableView의 내용은 CoreData ManagedObjectContext에 바인딩 된 NSArrayController에 대한 바인딩을 통해 제공됩니다. NSTableView의 새로운 행은 방금 추가되거나 절대로 다시 정렬되지 않습니다.NSScrollView를 고정 된 상태로 유지하십시오.

NSTableView (또는 각각 NSScrollView)를 아래쪽으로 고정시켜 테이블에 추가 된 새 줄을 즉시 볼 수있게하고 싶습니다. 또한 NSTableView가 맨 아래로 스크롤 될 때 사용자가 다른 행을 검토하기 위해 위로 스크롤 한 경우가 아닌 경우에만 발생합니다.

나는 현재이 지금까지 작동하는 다음 코드

- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row { 
    NSInteger numberOfRows = [tableView numberOfRows]; 
    NSLog(@"row: %lu, %lu numberOfRows ", row, numberOfRows); 
    if (row == numberOfRows-1) { 
     [tableView scrollRowToVisible:numberOfRows - 1]; 
    } 
} 

를 사용하고 있지만, 윈도우가 활성화 된 바로 그 때. 윈도우가 비활성 상태 일 때, 윈도우가 다시 활성화 될 때까지 didAddRowView 메소드가 호출되지 않습니다. 따라서 NSTableView는 즉시 아래로 스크롤하지 않습니다. NSTableView도 CoreData 바인딩을 통해 채워지기 때문에 새로운 항목이 삽입되면 스크롤을 수동으로 트리거 할 수있는 지점을 알지 못합니다. 또한 didAddRowView 대리자 메서드는 매우 자주 호출되며 (예 : 테이블을 수동으로 스크롤 할 때), 새로운 항목이 삽입되면 스크롤해야만 솔루션을 훨씬 더 우아하게 만들 수 있습니다.

NSTableView에 새로운 행이 추가되었을 때 응용 프로그램이 활성 상태이고 비활성 상태 일 때 맨 아래로 스크롤하기 위해 삽입 프로세스 나 NSScrollView에 직접 연결할 수있는 지점이 있습니까?

편집

: @rdelmar의 솔루션 완료 또는 경우를 위해서 당신을 위해 작동하지 않습니다, 나는 문제의 NSTableView는 서브 클래 싱과 reloadData 방법

- (void) reloadData { 
    [super reloadData]; 
    NSInteger numberOfRows = [self numberOfRows]; 
    NSRange rowsInRect = [self rowsInRect:self.superview.bounds]; 
    NSInteger lastVisibleRow = rowsInRect.location + rowsInRect.length; 

    if (lastVisibleRow == numberOfRows-1) { 
     [self scrollRowToVisible:numberOfRows - 1]; 
    } 
} 

이를 구현했습니다 reloadData 메서드는 새 항목이 ArrayController에서 수신되면 호출되고 테이블에 추가됩니다. 수퍼 클래스의 reloadData를 호출 한 후 TableView가 맨 아래로 스크롤되었는지 확인합니다 (TableView의 마지막 행이 수퍼 뷰에 표시되는 마지막 행이므로 주변 NSScrollView). 그렇다면, 아래로 스크롤됩니다. 그렇지 않은 경우 사용자는 스크롤하여 테이블의 일부 내용을 검토하고 자동으로 아래로 스크롤하지 않도록합니다.

+0

어떻게 당신이 당신의 핵심 데이터 데이터베이스에 새 데이터를 추가? 그것은 사용자의 작업하에 있거나 서버 다운로드 등을 통해 자동으로 업데이트됩니까? – rdelmar

답변

0

NSManagedObjectContext 알림, NSManagedObjectContextObjectsDidChangeNotification 사용할 수 있어야한다고 생각합니다. 사용자 정의 NSTableView는 클래스를 생성하고 그 통지를 관찰자를 추가

@implementation CustomTable

-(void)awakeFromNib { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollTable:) name:NSManagedObjectContextObjectsDidChangeNotification object:nil]; 
} 

-(void)scrollTable:(NSNotification *) aNote { 
    if ([[aNote.userInfo allKeys] containsObject:@"inserted"]) { 
     [self scrollRowToVisible:self.numberOfRows -1]; 
    }else{ 
     NSLog(@"It was not an insertion"); 
    } 
} 
+0

ArrayController의 addObject (또는 다른 추가/삽입 메소드)는 CoreData ManagedObjectContext에 직접 바인딩되어 있으므로 호출되지 않습니다. 그렇지 않다면 당신의 솔루션은 내가가는 길일 것입니다. – BinaryBucks

+0

어떻게 핵심 데이터에 새로운 데이터를 추가하고 있습니까? – rdelmar

+0

@BinaryBucks, 내 편집 된 답변을 참조하십시오,이게 효과가 있다고 생각합니다. – rdelmar

관련 문제