UITableViewCell – 为选中的行保留选中标记

这是UITableViewCell的后续问题- 每个部分选中一行 。 在这里,我有两个部分,每个3行,如下所示:

  1. search距离

    • 250英尺

    • 1000英尺

    • 4000英尺

  2. 地图types

    • 标准

    • 卫星

    • 混合动力

我在第2节(MAP TYPE)中遇到问题。 我希望将“标准”选中为默认值,以后用户select的任何选项都可以保存并传递到另一个包含地图视图的视图控制器,以根据所选的地图types进行显示。 我目前的代码不允许我这样做第2节。 任何人,请帮助检查我的代码,并build议我需要添加/修改?

我一直在试图了解它是如何工作的第一部分(search距离),但我只是不完全明白。 这似乎涉及委托文件做caching的东西。

在这里我的代码是:

#import "PAWSettingsViewController.h" #import "PAWAppDelegate.h" #import <Parse/Parse.h> @interface PAWSettingsViewController () - (NSString *)distanceLabelForCell:(NSIndexPath *)indexPath; - (PAWLocationAccuracy)distanceForCell:(NSIndexPath *)indexPath; - (NSString *)maptypeLabelForCell:(NSIndexPath *)indexPath; - (PAWMaptypeSelect)maptypeForCell:(NSIndexPath *)indexPath; @property (nonatomic, assign) CLLocationAccuracy filterDistance; @end typedef enum { kPAWSettingsTableViewDistance = 0, kPAWSettingsTableViewMaptype, kPAWSettingsTableViewNumberOfSections } kPAWSettingsTableViewSections; typedef enum { kPAWSettingsTableViewDistanceSection250FeetRow = 0, kPAWSettingsTableViewDistanceSection1000FeetRow, kPAWSettingsTableViewDistanceSection4000FeetRow, kPAWSettingsTableViewDistanceNumberOfRows } kPAWSettingsTableViewDistanceSectionRows; typedef enum { kPAWSettingsTableViewMaptypeSectionStandardRow = 0, kPAWSettingsTableViewMaptypeSectionSatelliteRow, kPAWSettingsTableViewMaptypeSectionHybridRow, kPAWSettingsTableViewMaptypeNumberOfRows } kPAWSettingsTableViewMaptypeSectionRows; @implementation PAWSettingsViewController @synthesize tableView; @synthesize filterDistance; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization PAWAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; self.filterDistance = appDelegate.filterDistance; } return self; } #pragma mark - Custom setters // Always fault our filter distance through to the app delegate. We just cache it locally because it's used in the tableview's cells. - (void)setFilterDistance:(CLLocationAccuracy)aFilterDistance { PAWAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDelegate.filterDistance = aFilterDistance; filterDistance = aFilterDistance; } #pragma mark - View lifecycle - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } #pragma mark - Private helper methods - (NSString *)distanceLabelForCell:(NSIndexPath *)indexPath { NSString *cellText = nil; switch (indexPath.row) { case kPAWSettingsTableViewDistanceSection250FeetRow: cellText = @"250 feet"; break; case kPAWSettingsTableViewDistanceSection1000FeetRow: cellText = @"1000 feet"; break; case kPAWSettingsTableViewDistanceSection4000FeetRow: cellText = @"4000 feet"; break; case kPAWSettingsTableViewDistanceNumberOfRows: // never reached. default: cellText = @"The universe"; break; } return cellText; } - (PAWLocationAccuracy)distanceForCell:(NSIndexPath *)indexPath { PAWLocationAccuracy distance = 0.0; switch (indexPath.row) { case kPAWSettingsTableViewDistanceSection250FeetRow: distance = 250; break; case kPAWSettingsTableViewDistanceSection1000FeetRow: distance = 1000; break; case kPAWSettingsTableViewDistanceSection4000FeetRow: distance = 4000; break; case kPAWSettingsTableViewDistanceNumberOfRows: // never reached. default: distance = 10000 * kPAWFeetToMiles; break; } return distance; } - (NSString *)maptypeLabelForCell:(NSIndexPath *)indexPath { NSString *cellText = nil; switch (indexPath.row) { case kPAWSettingsTableViewMaptypeSectionStandardRow: cellText = @"Standard"; break; case kPAWSettingsTableViewMaptypeSectionSatelliteRow: cellText = @"Satellite"; break; case kPAWSettingsTableViewMaptypeSectionHybridRow: cellText = @"Hybrid"; break; case kPAWSettingsTableViewMaptypeNumberOfRows: // never reached. default: cellText = @"?"; break; } return cellText; } - (PAWMaptypeSelect)maptypeForCell:(NSIndexPath *)indexPath { PAWMaptypeSelect maptype = nil; switch (indexPath.row) { case kPAWSettingsTableViewMaptypeSectionStandardRow: maptype = @"Standard"; break; case kPAWSettingsTableViewMaptypeSectionSatelliteRow: maptype = @"Satellite"; break; case kPAWSettingsTableViewMaptypeSectionHybridRow: maptype = @"Hybrid"; break; case kPAWSettingsTableViewMaptypeNumberOfRows: // never reached. default: maptype = nil; break; } return maptype; } #pragma mark - UINavigationBar-based actions - (IBAction)done:(id)sender { [self.presentingViewController dismissModalViewControllerAnimated:YES]; } #pragma mark - UITableViewDataSource methods - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return kPAWSettingsTableViewNumberOfSections; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch ((kPAWSettingsTableViewSections)section) { case kPAWSettingsTableViewDistance: return kPAWSettingsTableViewDistanceNumberOfRows; break; case kPAWSettingsTableViewMaptype: return kPAWSettingsTableViewMaptypeNumberOfRows; break; case kPAWSettingsTableViewNumberOfSections: return 0; break; }; } - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *identifier = @"SettingsTableView"; if (indexPath.section == kPAWSettingsTableViewDistance) { UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:identifier]; if ( cell == nil ) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:identifier]; } // Configure the cell. cell.tag = indexPath.section; cell.textLabel.text = [self distanceLabelForCell:indexPath]; if (self.filterDistance == 0.0) { NSLog(@"We have a zero filter distance!"); } PAWLocationAccuracy filterDistanceInFeet = self.filterDistance * ( 1 / kPAWFeetToMeters); PAWLocationAccuracy distanceForCell = [self distanceForCell:indexPath]; if (abs(distanceForCell - filterDistanceInFeet) < 0.001 ) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } else { cell.accessoryType = UITableViewCellAccessoryNone; } return cell; } else if (indexPath.section == kPAWSettingsTableViewMaptype){ UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:identifier]; if ( cell == nil ) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:identifier]; } // Configure the cell. cell.tag = indexPath.section; cell.textLabel.text = [self maptypeLabelForCell:indexPath]; //**** I don't know how to do here? **** return cell; } else { return nil; } } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { switch ((kPAWSettingsTableViewSections)section) { case kPAWSettingsTableViewDistance: return @"Search Distance"; break; case kPAWSettingsTableViewMaptype: return @"Map Type"; break; case kPAWSettingsTableViewNumberOfSections: return @""; break; } } #pragma mark - UITableViewDelegate methods // Called after the user changes the selection. - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == kPAWSettingsTableViewDistance) { [aTableView deselectRowAtIndexPath:indexPath animated:YES]; // if we were already selected, bail and save some work. UITableViewCell *selectedCell = [aTableView cellForRowAtIndexPath:indexPath]; if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) { return; } // uncheck all visible cells. for (UITableViewCell *cell in [aTableView visibleCells]) { if (cell.accessoryType != UITableViewCellAccessoryNone && cell.tag == indexPath.section) { cell.accessoryType = UITableViewCellAccessoryNone; } } selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; PAWLocationAccuracy distanceForCellInFeet = [self distanceForCell:indexPath]; self.filterDistance = distanceForCellInFeet * kPAWFeetToMeters; } else if (indexPath.section == kPAWSettingsTableViewMaptype){ [aTableView deselectRowAtIndexPath:indexPath animated:YES]; // if we were already selected, bail and save some work. UITableViewCell *selectedCell = [aTableView cellForRowAtIndexPath:indexPath]; if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) { return; } // uncheck all visible cells. for (UITableViewCell *cell in [aTableView visibleCells]) { if (cell.accessoryType != UITableViewCellAccessoryNone && cell.tag == indexPath.section) { cell.accessoryType = UITableViewCellAccessoryNone; } } selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; //**** I don't know how to do here? **** } } @end 

使用一个布尔variables。 像isFirstTime一样。

然后在viewDidLoad中:将你的isFirstTimevariables初始化为YES。

 isFirstTime = YES; 

在你的

  - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

更新这部分

 else if (indexPath.section == kPAWSettingsTableViewMaptype){ UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:identifier]; if ( cell == nil ) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:identifier]; } if ( isFirstTime == YES && indexPath.row == 0) { } // Configure the cell. cell.tag = indexPath.section; cell.textLabel.text = [self maptypeLabelForCell:indexPath]; //**** I don't know how to do here? **** return cell; } 

我已经想出了我自己的问题。 我决定去全局variables保存选定的select在第2节。 我在.m文件中声明全局variables:

 int gmaptypeSelected; 

在cellForRowAtOIndexPath部分我把这样的条件:

 else if (indexPath.section == kPAWSettingsTableViewMaptype){ UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:identifier]; if ( cell == nil ) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:identifier]; } // Configure the cell. cell.tag = indexPath.section; cell.textLabel.text = [self maptypeLabelForCell:indexPath]; MKMapType maptypeForCell = [self maptypeForCell:indexPath]; if (maptypeForCell == gmaptypeSelected) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } else { cell.accessoryType = UITableViewCellAccessoryNone; } return cell; } 

在MapView控制器> viewWillAppear将如下所示:

 - (void)viewWillAppear:(BOOL)animated { extern int gmaptypeSelected; if (gmaptypeSelected == 0) { self.mapView.mapType = MKMapTypeStandard; } else if (gmaptypeSelected == 1) { self.mapView.mapType = MKMapTypeSatellite; } else if (gmaptypeSelected == 2) { self.mapView.mapType = MKMapTypeHybrid; } [locationManager startUpdatingLocation]; [super viewWillAppear:animated]; }