UITableViewCell - 为选定行保留选中标记

时间:2014-08-23 06:17:06

标签: ios objective-c uitableview checkmark accessorytype

这是UITableViewCell - check mark one row per section的后续问题。 这里我有2个部分,每个部分有3行,如下所示:

  1. 搜索距离

    • 250英尺

    • 1000英尺

    • 4000英尺

  2. MAP TYPE

    • 标准

    • 卫星

    • 混合

  3. 我在第2节(MAP TYPE)中遇到了问题。我希望有标准的'检查为默认值,用户稍后选择的任何选项都可以保存并传递到另一个视图控制器,该控制器包含要根据所选地图类型显示的地图视图。我当前的代码不允许我这样做第2节。任何人,请帮助检查我的代码并建议我需要添加/修改的内容?

    我一直试图了解它如何适用于第1部分(SEARCH DISTANCE),但我还是不太明白。它似乎涉及委托文件来做缓存事情。

    我的代码是:

    #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
    

2 个答案:

答案 0 :(得分:0)

使用bool变量。和osFirstTimer一样。

然后在viewDidLoad中:将osFirstTimer变量初始化为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;
}

答案 1 :(得分:0)

我已经找到了自己的问题。我决定在第2节中使用全局变量来保存选定的选项。 我在.m文件中声明了全局变量:

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控制器&gt; 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];
}