2014-12-03 10 views
10

Ho un UITableView e voglio essere in grado di aggiungere nuove righe alla parte inferiore con animazione, stavo usando tableView reloadData e che funzionava bene, ma voglio animazione. Così ho passato anche a tableView reloadSections ma il problema è che se ho detto 7 righe visibili, anima tutte e 7 quelle file. Voglio solo animarlo aggiungendo la nuova riga e non tutte le righe sullo schermo come se fosse stata aggiunta.UITableView aggiunge nuove righe al fondo con animazione senza ricaricare tutta la tabella

Qualche idea su come fare questo?

risposta

11

Sotto UITableView si può chiamare un metodo

- (void) insertRowsAtIndexPaths:(NSArray*) indexPaths 
       withRowAnimation: (UITableViewRowAnimation) animation 

Ciò consente di specificare le righe della sezione sono state vuoi inserire una nuova cella e superare ciò che l'animazione che si desidera utilizzare. Codice Esempio:

// 
// InsertingNewRowToBottomOfTableViewController.m 
// Testing-Code-Snippets 
// 

#import "InsertingNewRowToBottomOfTableViewController.h" 

@interface InsertingNewRowToBottomOfTableViewController() 
@end 

#define kTestResuseCellIdentifier @"kTestResuseCell" 

@implementation InsertingNewRowToBottomOfTableViewController 
{ 
    NSMutableArray *testArray; 
} 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    self->testArray = [[NSMutableArray alloc] initWithArray:@[@"Test 1", @"Test 2", @"Test 3"]]; 

    UIRefreshControl *customRefreshControl = [[UIRefreshControl alloc] init]; 
    customRefreshControl.backgroundColor = [UIColor purpleColor]; 
    [customRefreshControl addTarget:self action:@selector(onRefresh:) forControlEvents:UIControlEventValueChanged]; 
    self.refreshControl = customRefreshControl; 
} 

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

- (void) onRefresh: (UIRefreshControl*) refreshControl 
{ 
    [refreshControl endRefreshing]; 
    [self->testArray addObject:[NSString stringWithFormat:@"Test %lu", self->testArray.count + 1]]; 
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self->testArray.count - 1 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; 
    NSLog(@"Added a new cell to the bottom!"); 
} 

#pragma mark - Table view data source 

- (NSInteger) numberOfSectionsInTableView: (UITableView*) tableView 
{ 
    return 1; 
} 

- (NSInteger) tableView: (UITableView*) tableView numberOfRowsInSection: (NSInteger) section 
{ 
    return self->testArray.count; 
} 


- (UITableViewCell*) tableView: (UITableView*) tableView cellForRowAtIndexPath: (NSIndexPath*) indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTestResuseCellIdentifier forIndexPath:indexPath]; 
    cell.textLabel.text = [self->testArray objectAtIndex:indexPath.row]; 
    return cell; 
} 
@end 

Aggiornamento: Swift 3 Versione

import UIKit 

class InsertingNewRowToBottomOfTableViewController: UITableViewController 
{ 
    private let testResuseCellIdentifier:String = "kTestResuseCell" 
    private let testArray:NSMutableArray = NSMutableArray(array:["Test 1", "Test 2", "Test 3"]) 

    // MARK: - View Events 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     let refreshControl:UIRefreshControl = UIRefreshControl() 
     refreshControl.backgroundColor = UIColor.purple 
     refreshControl.addTarget(self, action:#selector(self.onRefresh(refreshControl:)), for:.valueChanged) 
     self.refreshControl = refreshControl 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
    } 

    // MARK: - UIRefreshControl 

    @objc private func onRefresh(refreshControl: UIRefreshControl) 
    { 
     refreshControl.endRefreshing() 
     testArray.add("Test \(self.testArray.count + 1)") 

     let indexPath:IndexPath = IndexPath(row:(self.testArray.count - 1), section:0) 
     self.tableView.insertRows(at:[indexPath], with: .left) 
     NSLog("Added a new cell to the bottom!") 
    } 

    // MARK: - UITableViewDataSource 

    override func numberOfSections(in tableView: UITableView) -> Int 
    { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return self.testArray.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier:testResuseCellIdentifier)! 
     cell.textLabel?.text = self.testArray.object(at: indexPath.row) as? String 
     return cell 
    } 
} 
+0

Quindi dovrei usare che in combinazione con reloadData o solo quello? – Steven

+0

Dovresti essere in grado di chiamare solo questo metodo. Farò una piccola app in questo momento e la raddoppierò comunque. –

+0

Grazie mille Sea McDonal. salva le mie giornate – DJtiwari

Problemi correlati