08 Table Views
Upcoming SlideShare
Loading in...5
×
 

08 Table Views

on

  • 2,829 views

 

Statistics

Views

Total Views
2,829
Views on SlideShare
2,827
Embed Views
2

Actions

Likes
3
Downloads
102
Comments
0

1 Embed 2

http://www.slideshare.net 2

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

08 Table Views 08 Table Views Presentation Transcript

  • CS193P - Lecture 8 iPhone Application Development Scroll Views & Table Views Saturday, January 30, 2010 1
  • Saturday, January 30, 2010 2
  • iPhone SDK 3.2 Saturday, January 30, 2010 3 View slide
  • iPhone SDK 3.2 • Support for iPad Saturday, January 30, 2010 3 View slide
  • iPhone SDK 3.2 • Support for iPad • Beta Release Saturday, January 30, 2010 3
  • iPhone SDK 3.2 • Support for iPad • Beta Release Enrollment in iPhone Developer Standard or Enterprise required Saturday, January 30, 2010 3
  • Announcements • Paparazzi 1 due next Wednesday (2/3) Saturday, January 30, 2010 4
  • Today’s Topics • Scroll views • Table views ■ Displaying data ■ Controlling appearance & behavior • UITableViewController • Table view cells Saturday, January 30, 2010 5
  • Scroll Views Saturday, January 30, 2010 6
  • UIScrollView • For displaying more content than can fit on the screen Saturday, January 30, 2010 7
  • UIScrollView • For displaying more content than can fit on the screen • Handles gestures for panning and zooming Saturday, January 30, 2010 7
  • UIScrollView • For displaying more content than can fit on the screen • Handles gestures for panning and zooming • Noteworthy subclasses: UITableView and UITextView Saturday, January 30, 2010 7
  • Scrolling Examples Saturday, January 30, 2010 8
  • Scrolling Examples Saturday, January 30, 2010 8
  • Scrolling Examples Saturday, January 30, 2010 8
  • Scrolling Examples Saturday, January 30, 2010 8
  • Scrolling Examples Saturday, January 30, 2010 8
  • Scrolling Examples Saturday, January 30, 2010 8
  • Content Size Saturday, January 30, 2010 9
  • Content Size contentSize.width contentSize.height Saturday, January 30, 2010 9
  • Content Inset contentSize.width contentInset.top contentSize.height contentInset.bottom Saturday, January 30, 2010 10
  • Content Inset Saturday, January 30, 2010 11
  • Content Inset Saturday, January 30, 2010 11
  • Content Inset Saturday, January 30, 2010 12
  • Content Inset contentInset.top Saturday, January 30, 2010 12
  • Content Inset contentInset.top Saturday, January 30, 2010 13
  • Content Inset contentInset.top contentInset.bottom Saturday, January 30, 2010 13
  • Scroll Indicator Insets Saturday, January 30, 2010 14
  • Scroll Indicator Insets Saturday, January 30, 2010 14
  • Scroll Indicator Insets Saturday, January 30, 2010 14
  • Scroll Indicator Insets scrollIndicatorInsets.top Saturday, January 30, 2010 14
  • Content Offset Saturday, January 30, 2010 15
  • Content Offset Saturday, January 30, 2010 15
  • Content Offset Saturday, January 30, 2010 15
  • contentSize.width contentInset.top contentSize.height contentInset.bottom contentInset.left contentInset.right Saturday, January 30, 2010 16
  • Saturday, January 30, 2010 17
  • contentOffset.x contentOffset.y Saturday, January 30, 2010 17
  • Saturday, January 30, 2010 18
  • Saturday, January 30, 2010 18
  • contentOffset.x (-contentInset.left) contentOffset.y (-contentInset.top) Saturday, January 30, 2010 18
  • Using a Scroll View Saturday, January 30, 2010 19
  • Using a Scroll View • Create with the desired frame CGRect frame = CGRectMake(0, 0, 200, 200); scrollView = [[UIScrollView alloc] initWithFrame:frame]; Saturday, January 30, 2010 19
  • Using a Scroll View • Create with the desired frame CGRect frame = CGRectMake(0, 0, 200, 200); scrollView = [[UIScrollView alloc] initWithFrame:frame]; • Add subviews (frames may extend beyond scroll view bounds) frame = CGRectMake(0, 0, 500, 500); myImageView = [[UIImageView alloc] initWithFrame:frame]; [scrollView addSubview:myImageView]; Saturday, January 30, 2010 19
  • Using a Scroll View • Create with the desired frame CGRect frame = CGRectMake(0, 0, 200, 200); scrollView = [[UIScrollView alloc] initWithFrame:frame]; • Add subviews (frames may extend beyond scroll view bounds) frame = CGRectMake(0, 0, 500, 500); myImageView = [[UIImageView alloc] initWithFrame:frame]; [scrollView addSubview:myImageView]; • Set the content size scrollView.contentSize = CGSizeMake(500, 500); Saturday, January 30, 2010 19
  • Extending Scroll View Behavior • Applications often want to know about scroll events Saturday, January 30, 2010 20
  • Extending Scroll View Behavior • Applications often want to know about scroll events ■ When the scroll offset is changed Saturday, January 30, 2010 20
  • Extending Scroll View Behavior • Applications often want to know about scroll events ■ When the scroll offset is changed ■ When dragging begins & ends Saturday, January 30, 2010 20
  • Extending Scroll View Behavior • Applications often want to know about scroll events ■ When the scroll offset is changed ■ When dragging begins & ends ■ When deceleration begins & ends Saturday, January 30, 2010 20
  • Extending with a Subclass • Create a subclass • Override methods to customize behavior Saturday, January 30, 2010 21
  • Extending with a Subclass • Create a subclass • Override methods to customize behavior • Issues with this approach Saturday, January 30, 2010 21
  • Extending with a Subclass • Create a subclass • Override methods to customize behavior • Issues with this approach ■ Application logic and behavior is now part of a View class Saturday, January 30, 2010 21
  • Extending with a Subclass • Create a subclass • Override methods to customize behavior • Issues with this approach ■ Application logic and behavior is now part of a View class ■ Tedious to write a one-off subclass for every scroll view instance Saturday, January 30, 2010 21
  • Extending with a Subclass • Create a subclass • Override methods to customize behavior • Issues with this approach ■ Application logic and behavior is now part of a View class ■ Tedious to write a one-off subclass for every scroll view instance ■ Your code becomes tightly coupled with superclass Saturday, January 30, 2010 21
  • Extending with Delegation • Delegate is a separate object • Clearly defined points of responsibility ■ Change behavior ■ Customize appearance • Loosely coupled with the object being extended Saturday, January 30, 2010 22
  • UIScrollView Delegate Saturday, January 30, 2010 23
  • UIScrollView Delegate @protocol UIScrollViewDelegate<NSObject> Saturday, January 30, 2010 23
  • UIScrollView Delegate @protocol UIScrollViewDelegate<NSObject> @optional Saturday, January 30, 2010 23
  • UIScrollView Delegate @protocol UIScrollViewDelegate<NSObject> @optional // Respond to interesting events - (void)scrollViewDidScroll:(UIScrollView *)scrollView; Saturday, January 30, 2010 23
  • UIScrollView Delegate @protocol UIScrollViewDelegate<NSObject> @optional // Respond to interesting events - (void)scrollViewDidScroll:(UIScrollView *)scrollView; ... // Influence behavior - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView; @end Saturday, January 30, 2010 23
  • Implementing a Delegate Saturday, January 30, 2010 24
  • Implementing a Delegate • Conform to the delegate protocol @interface MyController : NSObject <UIScrollViewDelegate> Saturday, January 30, 2010 24
  • Implementing a Delegate • Conform to the delegate protocol @interface MyController : NSObject <UIScrollViewDelegate> • Implement all required methods and any optional methods - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // Do something in response to the new scroll position if (scrollView.contentOffset ...) { } } Saturday, January 30, 2010 24
  • Zooming with a Scroll View Saturday, January 30, 2010 25
  • Zooming with a Scroll View • Set the minimum, maximum, initial zoom scales scrollView.maximumZoomScale = 2.0; scrollView.minimumZoomScale = scrollView.size.width / myImage.size.width; Saturday, January 30, 2010 25
  • Zooming with a Scroll View • Set the minimum, maximum, initial zoom scales scrollView.maximumZoomScale = 2.0; scrollView.minimumZoomScale = scrollView.size.width / myImage.size.width; • Implement delegate method for zooming - (UIView *)viewForZoomingInScrollView:(UIView *)view { return someViewThatWillBeScaled; } Saturday, January 30, 2010 25
  • Set Zoom Scale - (void)setZoomScale:(float)scale animated:(BOOL); Saturday, January 30, 2010 26
  • Set Zoom Scale - (void)setZoomScale:(float)scale animated:(BOOL); Saturday, January 30, 2010 26
  • Set Zoom Scale - (void)setZoomScale:(float)scale animated:(BOOL); Saturday, January 30, 2010 26
  • Zoom to Rect - (void)zoomToRect:(CGRect)rect animated:(BOOL); Saturday, January 30, 2010 27
  • Zoom to Rect - (void)zoomToRect:(CGRect)rect animated:(BOOL); Saturday, January 30, 2010 27
  • Zoom to Rect - (void)zoomToRect:(CGRect)rect animated:(BOOL); Saturday, January 30, 2010 27
  • Zoom to Rect - (void)zoomToRect:(CGRect)rect animated:(BOOL); Saturday, January 30, 2010 28
  • Zoom to Rect - (void)zoomToRect:(CGRect)rect animated:(BOOL); Saturday, January 30, 2010 28
  • Zoom to Rect - (void)zoomToRect:(CGRect)rect animated:(BOOL); Saturday, January 30, 2010 28
  • Demo Saturday, January 30, 2010 29
  • Table Views Saturday, January 30, 2010 30
  • Table Views • Display lists of content ■ Single column, multiple rows ■ Vertical scrolling ■ Large data sets • Powerful and ubiquitous in iPhone applications Saturday, January 30, 2010 31
  • Table View Styles Saturday, January 30, 2010 32
  • Table View Styles UITableViewStylePlain Saturday, January 30, 2010 32
  • Table View Styles UITableViewStylePlain UITableViewStyleGrouped Saturday, January 30, 2010 32
  • Table View Anatomy Plain Style Saturday, January 30, 2010 33
  • Table View Anatomy Plain Style Table Header Saturday, January 30, 2010 33
  • Table View Anatomy Plain Style Table Header Table Footer Saturday, January 30, 2010 33
  • Table View Anatomy Plain Style Table Header Section Table Footer Saturday, January 30, 2010 33
  • Table View Anatomy Plain Style Table Header Section Header Section Table Footer Saturday, January 30, 2010 33
  • Table View Anatomy Plain Style Table Header Section Header Section Footer Section Table Footer Saturday, January 30, 2010 33
  • Table View Anatomy Plain Style Table Header Section Header Table Cell Section Footer Section Table Footer Saturday, January 30, 2010 33
  • Table View Anatomy Plain Style Table Header Section Header Table Cell Section Footer Section Table Footer Saturday, January 30, 2010 34
  • Table View Anatomy Grouped Style Table Header Section Header Table Cell Section Footer Section Table Footer Saturday, January 30, 2010 35
  • Using Table Views • Displaying your data in the table view • Customizing appearance & behavior Saturday, January 30, 2010 36
  • Displaying Data in a Table View Saturday, January 30, 2010 37
  • A Naïve Solution Saturday, January 30, 2010 38
  • A Naïve Solution • Table views display a list of data, so use an array [myTableView setList:myListOfStuff]; Saturday, January 30, 2010 38
  • A Naïve Solution • Table views display a list of data, so use an array [myTableView setList:myListOfStuff]; • Issues with this approach Saturday, January 30, 2010 38
  • A Naïve Solution • Table views display a list of data, so use an array [myTableView setList:myListOfStuff]; • Issues with this approach ■ All data is loaded upfront Saturday, January 30, 2010 38
  • A Naïve Solution • Table views display a list of data, so use an array [myTableView setList:myListOfStuff]; • Issues with this approach ■ All data is loaded upfront ■ All data stays in memory Saturday, January 30, 2010 38
  • A More Flexible Solution • Another object provides data to the table view ■ Not all at once ■ Just as it’s needed for display • Like a delegate, but purely data-oriented Saturday, January 30, 2010 39
  • UITableViewDataSource Saturday, January 30, 2010 40
  • UITableViewDataSource • Provide number of sections and rows // Optional method, defaults to 1 if not implemented - (NSInteger)numberOfSectionsInTableView:(UITableView *)table; // Required method - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; Saturday, January 30, 2010 40
  • UITableViewDataSource • Provide number of sections and rows // Optional method, defaults to 1 if not implemented - (NSInteger)numberOfSectionsInTableView:(UITableView *)table; // Required method - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; • Provide cells for table view as needed // Required method - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; Saturday, January 30, 2010 40
  • Datasource Message Flow Datasource Saturday, January 30, 2010 41
  • Datasource Message Flow numberOfSectionsInTableView: How many sections? Datasource Saturday, January 30, 2010 41
  • Datasource Message Flow numberOfSectionsInTableView: Datasource 5 Saturday, January 30, 2010 41
  • Datasource Message Flow Datasource Saturday, January 30, 2010 42
  • Datasource Message Flow tableView:numberOfRowsInSection: How many rows in section 0? Datasource Saturday, January 30, 2010 42
  • Datasource Message Flow tableView:numberOfRowsInSection: Datasource 1 Saturday, January 30, 2010 42
  • Datasource Message Flow Datasource Saturday, January 30, 2010 43
  • Datasource Message Flow tableView:cellForRowAtIndexPath: What to display at section 0, row 0? Datasource Saturday, January 30, 2010 43
  • Datasource Message Flow tableView:cellForRowAtIndexPath: Datasource Cell with text “John Appleseed” Saturday, January 30, 2010 43
  • NSIndexPath • Generic class in Foundation • Path to a specific node in a tree of nested arrays 0 1 2 3 4 Saturday, January 30, 2010 44
  • NSIndexPath • Generic class in Foundation • Path to a specific node in a tree of nested arrays 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 Saturday, January 30, 2010 44
  • NSIndexPath and Table Views • Cell location described with an index path ■ Section index + row index Saturday, January 30, 2010 45
  • NSIndexPath and Table Views • Cell location described with an index path ■ Section index + row index • Category on NSIndexPath with helper methods @interface NSIndexPath (UITableView) + (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section; @property(nonatomic,readonly) NSUInteger section; @property(nonatomic,readonly) NSUInteger row; @end Saturday, January 30, 2010 45
  • Single Section Table View Saturday, January 30, 2010 46
  • Single Section Table View • Return the number of rows - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [myStrings count]; } Saturday, January 30, 2010 46
  • Single Section Table View • Return the number of rows - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [myStrings count]; } • Provide a cell when requested - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = ...; cell.textLabel.text = [myStrings objectAtIndex:indexPath.row] return [cell autorelease]; } Saturday, January 30, 2010 46
  • Cell Reuse Saturday, January 30, 2010 47
  • Cell Reuse • When asked for a cell, it would be expensive to create a new cell each time. Saturday, January 30, 2010 47
  • Cell Reuse • When asked for a cell, it would be expensive to create a new cell each time. - (UITableViewCell *)dequeueReusableCellWithIdentifier: (NSString *)identifier; Saturday, January 30, 2010 47
  • Cell Reuse • When asked for a cell, it would be expensive to create a new cell each time. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@“MyIdentifier”]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:... reuseIdentifier:@“MyIdenifier”] autorelease]; } cell.text = [myStrings objectAtIndex:indexPath.row] return cell; } Saturday, January 30, 2010 47
  • Triggering Updates • When is the datasource asked for its data? Saturday, January 30, 2010 48
  • Triggering Updates • When is the datasource asked for its data? ■ When a row becomes visible Saturday, January 30, 2010 48
  • Triggering Updates • When is the datasource asked for its data? ■ When a row becomes visible ■ When an update is explicitly requested by calling -reloadData - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView reloadData]; } Saturday, January 30, 2010 48
  • Section and Row Reloading Saturday, January 30, 2010 49
  • Section and Row Reloading - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; Saturday, January 30, 2010 49
  • Section and Row Reloading - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; Saturday, January 30, 2010 49
  • Section and Row Reloading - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; Saturday, January 30, 2010 49
  • Section and Row Reloading - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; Saturday, January 30, 2010 49
  • Section and Row Reloading - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; Saturday, January 30, 2010 49
  • Section and Row Reloading - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; Saturday, January 30, 2010 49
  • Additional Datasource Methods • Titles for section headers and footers • Allow editing and reordering cells Saturday, January 30, 2010 50
  • Appearance & Behavior Saturday, January 30, 2010 51
  • UITableView Delegate • Customize appearance and behavior • Keep application logic separate from view • Often the same object as datasource Saturday, January 30, 2010 52
  • Table View Appearance & Behavior Saturday, January 30, 2010 53
  • Table View Appearance & Behavior • Customize appearance of table view cell - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; Saturday, January 30, 2010 53
  • Table View Appearance & Behavior • Customize appearance of table view cell - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; • Validate and respond to selection changes - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; Saturday, January 30, 2010 53
  • Row Selection in Table Views • In iPhone applications, rows rarely stay selected • Selecting a row usually triggers an event Saturday, January 30, 2010 54
  • Row Selection in Table Views • In iPhone applications, rows rarely stay selected • Selecting a row usually triggers an event Saturday, January 30, 2010 54
  • Persistent Selection Saturday, January 30, 2010 55
  • Persistent Selection Saturday, January 30, 2010 55
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Saturday, January 30, 2010 56
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Get the row and the object it represents Saturday, January 30, 2010 56
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Get the row and the object it represents NSUInteger row = indexPath.row Saturday, January 30, 2010 56
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Get the row and the object it represents NSUInteger row = indexPath.row id objectToDisplay = [myObjects objectAtIndex:row]; Saturday, January 30, 2010 56
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Get the row and the object it represents NSUInteger row = indexPath.row id objectToDisplay = [myObjects objectAtIndex:row]; // Create a new view controller and pass it along Saturday, January 30, 2010 56
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Get the row and the object it represents NSUInteger row = indexPath.row id objectToDisplay = [myObjects objectAtIndex:row]; // Create a new view controller and pass it along MyViewController *myViewController = ...; Saturday, January 30, 2010 56
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Get the row and the object it represents NSUInteger row = indexPath.row id objectToDisplay = [myObjects objectAtIndex:row]; // Create a new view controller and pass it along MyViewController *myViewController = ...; myViewController.object = objectToDisplay; Saturday, January 30, 2010 56
  • Responding to Selection // For a navigation hierarchy... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Get the row and the object it represents NSUInteger row = indexPath.row id objectToDisplay = [myObjects objectAtIndex:row]; // Create a new view controller and pass it along MyViewController *myViewController = ...; myViewController.object = objectToDisplay; [self.navigationController pushViewController:myViewController animated:YES]; } Saturday, January 30, 2010 56
  • Altering or Disabling Selection - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Don’t allow selecting certain rows? if (indexPath.row == ...) { return nil; } else { return indexPath; } } Saturday, January 30, 2010 57
  • UITableViewController Saturday, January 30, 2010 58
  • UITableViewController Saturday, January 30, 2010 59
  • UITableViewController • Convenient starting point for view controller with a table view ■ Table view is automatically created ■ Controller is table view’s delegate and datasource Saturday, January 30, 2010 59
  • UITableViewController • Convenient starting point for view controller with a table view ■ Table view is automatically created ■ Controller is table view’s delegate and datasource • Takes care of some default behaviors ■ Calls -reloadData the first time it appears ■ Deselects rows when user navigates back ■ Flashes scroll indicators Saturday, January 30, 2010 59
  • Table View Cells Saturday, January 30, 2010 60
  • Designated Initializer Saturday, January 30, 2010 61
  • Designated Initializer - (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier; Saturday, January 30, 2010 61
  • Designated Initializer ECATED EPR - (id)initWithFrame:(CGRect)frame DreuseIdentifier:(NSString *)reuseIdentifier; - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier; Saturday, January 30, 2010 61
  • Cell Styles Saturday, January 30, 2010 62
  • Cell Styles UITableViewCellStyleDefault Saturday, January 30, 2010 62
  • Cell Styles UITableViewCellStyleDefault UITableViewCellStyleSubtitle Saturday, January 30, 2010 62
  • Cell Styles UITableViewCellStyleDefault UITableViewCellStyleSubtitle UITableViewCellStyleValue1 Saturday, January 30, 2010 62
  • Cell Styles UITableViewCellStyleDefault UITableViewCellStyleSubtitle UITableViewCellStyleValue1 UITableViewCellStyleValue2 Saturday, January 30, 2010 62
  • Basic properties • UITableViewCell has an image view and one or two text labels Saturday, January 30, 2010 63
  • Basic properties • UITableViewCell has an image view and one or two text labels cell.imageView.image = [UIImage imageNamed:@“vitolidol.png”]; cell.textLabel.text = @“Vitol Idol”; cell.detailTextLabel.text = @“Billy Idol”; Saturday, January 30, 2010 63
  • Accessory Types // UITableView delegate method - (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath; Saturday, January 30, 2010 64
  • Accessory Types // UITableView delegate method - (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath; UITableViewCellAccessoryDisclosureIndicator Saturday, January 30, 2010 64
  • Accessory Types // UITableView delegate method - (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath; UITableViewCellAccessoryDisclosureIndicator UITableViewCellAccessoryDetailDisclosureButton Saturday, January 30, 2010 64
  • Accessory Types // UITableView delegate method - (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath; UITableViewCellAccessoryDisclosureIndicator UITableViewCellAccessoryDetailDisclosureButton - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { // Only for the blue disclosure button NSUInteger row = indexPath.row; ... } Saturday, January 30, 2010 64
  • Accessory Types // UITableView delegate method - (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath; UITableViewCellAccessoryDisclosureIndicator UITableViewCellAccessoryDetailDisclosureButton UITableViewCellAccessoryCheckmark - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { // Only for the blue disclosure button NSUInteger row = indexPath.row; ... } Saturday, January 30, 2010 64
  • Customizing the Content View • For cases where a simple image + text cell doesn’t suffice • UITableViewCell has a content view property ■ Add additional views to the content view Saturday, January 30, 2010 65
  • Customizing the Content View • For cases where a simple image + text cell doesn’t suffice • UITableViewCell has a content view property ■ Add additional views to the content view - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = ...; CGRect frame = cell.contentView.bounds; UILabel *myLabel = [[UILabel alloc] initWithFrame:frame]; myLabel.text = ...; [cell.contentView addSubview:myLabel]; [myLabel release]; } Saturday, January 30, 2010 65
  • Saturday, January 30, 2010 66
  • Saturday, January 30, 2010 66
  • Questions? Saturday, January 30, 2010 67