2009-08-12 10 views
0

Ich habe eine UITableView mit Zellen, die mit addSubview teilweise benutzerdefiniert sind. Ich verwende eine andere Zellen-ID für die letzte Zelle, deren Zweck es ist, mehr Daten von einem Server zu laden, wodurch neue Zellen erscheinen. (Denken Sie an die Zelle "Weitere Nachrichten vom Server laden" in Mail.app)Warum zeichnet UITableViewCell Auswahl nicht, wenn ich sehr schnell tippe?

z.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // <... code for normal cells omitted...> 
    static NSString *LoadMoreCellIdentifier = @"LoadMoreCellIdentifier"; 

    UILabel *loadMoreLabel; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LoadMoreCellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:LoadMoreCellIdentifier] autorelease]; 

     cell.selectionStyle = UITableViewCellSelectionStyleGray; 

     loadMoreLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, self.tableView.rowHeight - 1)] autorelease]; 
     loadMoreLabel.tag = LOAD_MORE_TAG; 
     loadMoreLabel.font = [UIFont boldSystemFontOfSize:16.0]; 
     loadMoreLabel.textColor = [UIColor colorWithRed:0.153 green:0.337 blue:0.714 alpha:1.0]; // Apple's "Load More Messages" font color in Mail.app 
     loadMoreLabel.textAlignment = UITextAlignmentCenter; 
     [cell.contentView addSubview:loadMoreLabel]; 
    } 
    else 
    { 
     loadMoreLabel = (UILabel *)[cell.contentView viewWithTag:LOAD_MORE_TAG]; 
    } 

    loadMoreLabel.text = [NSString stringWithFormat:@"Load Next %d Hours...", _defaultHoursQuery]; 
    return cell; 
} 

Wie Sie oben sehen können, habe ich cell.selectionStyle = UITableViewCellSelectionStyleGray;

Wenn Sie auf eine Zelle tippen, lösche ich die Auswahl wie folgt:

-  (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (_showLoadMoreEntriesButton && indexPath.row == [_sourceArray count]) 
    { 
     // <... omitted...> 
     // Do a potentially blocking 1 second operation here to obtain data for more 
     // cells. This will potentially change the size of the _sourceArray 
     // NSArray that acts as the source for my UITableCell 
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

     [self.tableView reloadData]; 
     return; 
    } 

    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
    [self _loadDataSetAtIndex:indexPath.row]; 
} 

Das Problem, das ich zu sehen bin, ist, dass ich mit dem Finger tippen haben und halten Sie die graue Highlight zu haben scheinen. Wenn ich sehr schnell tippe, wird kein Highlight angezeigt. Das Problem ist, dass ich manchmal eine Blockierung mache, die ungefähr eine Sekunde dauert. Ich möchte eine einfache UI-Rückmeldung, dass etwas passiert, anstatt nur die UI zu sperren. Ich denke, das hängt damit zusammen, dass ich bedingt überprüfe, ob der IndexPfad die letzte Zeile der Tabelle ist oder nicht.

Irgendeine Idee, wie man es schafft, den Höhepunkt jedes Mal zu zeichnen?

Antwort

1

Wenn möglich, verschieben Sie Ihre Blockierung in einen anderen Thread. NSOperation ist wahrscheinlich ein gutes System zu verwenden.

Es gibt keinen sauberen Weg, um den UI-Thread zu sagen, alles zu verarbeiten, während Sie in der Mitte einer Sperroperation sind.

+0

Ich möchte nicht, dass es etwas verarbeitet, ich möchte nur die Zellauswahl immer zeigen. Ich verstehe, dass es nicht reagieren wird. – Jeremy

+0

Wenn Ihr Code für den Hauptthread blockiert ist, wird keine Verarbeitung ausgeführt, die der UI-Thread ausführen muss, um Benutzereingaben zu aktualisieren und auf sie zu reagieren, und es gibt nicht wirklich einen Weg, neben Threads zu verwenden. –

+0

Das ist ein guter Punkt. Ich nehme an, ich sollte etwas Asynchrones versuchen. – Jeremy

Verwandte Themen