2011-02-10 10 views
6

Mam NSTableView, i chciałbym wiedzieć, kiedy użytkownik przewinął do dołu, więc mogę wykonać akcję. Nie jestem pewien, jak to zrobić?Jak ustalić, czy użytkownik przewinął do końca NSTableView

UPDATE: Oto jak ja obliczania dole tabeli:

-(void)tableViewDidScroll:(CPNotification) notification 
{ 
    var scrollView = [notification object]; 
    var currentPosition = CGRectGetMaxY([scrollView visibleRect]); 
    var tableViewHeight = [messagesTableView bounds].size.height - 100; 

    //console.log("TableView Height: " + tableViewHeight); 
    //console.log("Current Position: " + currentPosition); 

    if (currentPosition > tableViewHeight - 100) 
    { 
     console.log("we're at the bottom!"); 
    } 
} 

Odpowiedz

14

Możesz dodać siebie jako obserwator (w sensie NSNotificationCenter, a nie poczucie KVO/Wiązania) z NSViewBoundsDidChangeNotification przeprowadzoną table -enclosingScrollView's -contentView i reaguj w razie potrzeby na podstawie widocznego prostokąta.

Aktualizacja

Czy to gdzieś (może -awakeFromNib):

// Configure the scroll view to send frame change notifications 
id clipView = [[tableView enclosingScrollView] contentView]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(myBoundsChangeNotificationHandler:) 
              name:NSViewBoundsDidChangeNotification 
              object:clipView]; 

Put to gdzieś przydatne:

- (void)myBoundsChangeNotificationHandler:(NSNotification *)aNotification 
{ 

if ([aNotification object] == [[tableView enclosingScrollView] contentView]) 
    [self doSomethingInterestingIfDocumentVisibleRectSatisfiesMe]; 

} 

Zasadniczo chcesz zbadać widok zwoju -documentVisibleRect zobaczyć jeśli może widać dolną parę pikseli. Pamiętaj, aby uwzględnić możliwość wyświetlania widoków z odwróconymi układami współrzędnych - "widokami odwróconymi" - pokrytymi w Views Programming Guide.

+0

można pokazać fragment? –

+0

Zaktualizowałem wpis. –

+0

To działa dobrze, możesz mi pomóc trochę w obliczeniu, czy dolne piksele są widoczne? –

0

Jeśli chodzi o aktualizację: z pewnych powodów mam var currentPosition = CGRectGetMaxY ([scrollView visibleRect]); zawsze taką samą wartość, znalazłem lepiej użyć NSClipView granic:

NSClipView *clipView = ...; 
NSRect newClipBounds = [clipView bounds]; 
CGFloat currentPosition = newClipBounds.origin.y + newClipBounds.size.height;