Et UITableView får dataene og oppførselen sin fra en UITableViewController.
UITableViewController implementerer protokollene UITableViewDelegate og UITableViewDataSource
@interface UITableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
...
@end
Når UITableViewController skal trenger informasjon om hvilke data som skal vises (hvor mange rader? hva er innholdet i cella?) spør den sin UITableViewDataSource om dette. Tilsvarende spør den UITableViewDelegate om oppførsel (kan man trykke på cellen? hvor høy skal raden være?)
UITableViewController spør UITableViewDelegate og UITableViewDataSource er et eksempel på bruk av delegate patternet
@interface SpotifySearchResultTableViewController : UITableViewController
@end
UITableViewDataSource vil du se at vi minimum må implementere to metoder:
#import "SpotifySearchResultTableViewController.h"
#import "SpotifyService.h"
#import "SpotifyTrack.h"
@interface SpotifySearchResultTableViewController ()
@property (nonatomic, strong) NSArray* tracks;
@end
@implementation SpotifySearchResultTableViewController
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.tracks.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"trackCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
SpotifyTrack *track = self.tracks[indexPath.row];
cell.textLabel.text = track.title;
cell.detailTextLabel.text = track.artist;
return cell;
}
@end
static NSString *CellIdentifier = @"trackCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Disse linjene ser kanskje kryptiske ut, men er helt geniale! Det som skjer i praksis er at Cocoa Touch prøver å finne en celle som allerede er laget og scrollet ut av skjermen med IDen trackCell. Hvis det finnes en slik celle, blir den den gjenbrukt slik at man slipper å instansiere en ny og holde denne i minnet. Finnes den ikke blir det allokert et nytt UI celle for deg. Dette betyr at selv om du har en array med 1000 elementer, vil det aldri finnes flere UI celler enn man får plass til på skjermen.
trackCell som vist over). Dette gjør du ved å:
UITableViewDelegate og UITableViewDataSource skal bli kalt (og tabellen din fungere), må UITableViewet sette seg som delegate. Dette gjør du slik:
delegate ved siden av datasource og dra en linje som du slipper på viewcontrolleren (se bilde). Gjenta for dataSource delegatet.