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). 그렇다면, 아래로 스크롤됩니다. 그렇지 않은 경우 사용자는 스크롤하여 테이블의 일부 내용을 검토하고 자동으로 아래로 스크롤하지 않도록합니다.
어떻게 당신이 당신의 핵심 데이터 데이터베이스에 새 데이터를 추가? 그것은 사용자의 작업하에 있거나 서버 다운로드 등을 통해 자동으로 업데이트됩니까? – rdelmar