can you index characters from a UITableView section and use it as an alias to give an expanded name to Section?

StackOverflow https://stackoverflow.com/questions/22469888

  •  16-06-2023
  •  | 
  •  

Pergunta

I have a UITableView that lists reports from a website. These reports are from an existing database and I am not able to change the names they already have.

All of the report names start with the appropriate word to describe the reports type. i.e. POT, CA, Annual, Audit etc.

I have indexed the first 3 characters from these report names to section the reports into the appropriate sections, but this means that the section names are POT, Ann, CA , Aud etc. What I would like to do is take those indexed characters and use them as an alias to expand the names to their full names.

Can this be done easily?

EDIT TO SHOW WHAT HAS BEEN TRIED

I tried to set defines for the 3 letter indexed values, in the hope that they would change based on that information, but this did not work.

Does anyone have any ideas that could help me. I am more than happy to completely change my approach if there is another way to make it work. Maybe there is a way to remove numbers from values??

CURRENT CODE FOR UITABLEVIEW

#import "reportsTestViewController.h"
#import "ReportsDataObject.h"
#import "Session.h"

@interface reportsTestViewController ()

@end

@implementation reportsTestViewController

@synthesize response;

@synthesize myDataIvar;


#define POT "PATH OF TRAVEL"
#define Ann "ANNUAL PASSIVE"
#define Aud "AUDIT"
#define CA "CONTRACTOR AUDIT"


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    reportsTable.delegate = self;
    reportsTable.dataSource = self;
    self.sections = [[NSMutableDictionary alloc] init];

    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

#pragma mark NSURLConnection Delegate Methods
//    

    //Create your request pointing to the test page
   NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.tesg.com.au/allCustBuild.php"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];


    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    //initialize it when you create your connection
    if (connection){
        self.myDataIvar = [[NSMutableData alloc] init];
    }
}

    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
        [self.myDataIvar setLength:0];
    }

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
        [self.myDataIvar appendData:data];

    }

    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
        NSLog(@"Connection Failed: %@", error.userInfo);
    }

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    //this is where you would parse the data received back from the server
    NSString *responseString = [[NSString alloc] initWithData:self.myDataIvar encoding:NSUTF8StringEncoding];
    NSLog(@"Received Data: %@",responseString);
    [self setupReportsFromJSONArray:self.myDataIvar];

}

-(void)connectionWasASuccess:(NSData *)data{
    [self setupReportsFromJSONArray:data];

}



-(void)setupReportsFromJSONArray:(NSData*)dataFromReportsArray{
    BOOL found;
    NSError *error;
   // NSMutableArray *reportsArray = [[NSMutableArray alloc] init];
    NSArray *arrayFromServer = [NSJSONSerialization JSONObjectWithData:dataFromReportsArray options:0 error:&error];

    if(error){
        NSLog(@"error parsing the json data from server with error description - %@", [error localizedDescription]);
    }

    else {
        reportsArray = [[NSMutableArray alloc] init];
        for(NSDictionary *eachReport in arrayFromServer)
        {

            ReportsDataObject *report = [[ReportsDataObject alloc] initWithJSONData:eachReport];

            [reportsArray addObject:report];
            NSString *c = [[eachReport objectForKey:@"title"] substringToIndex:3];
                      found = NO;

            for (NSString *str in [self.sections allKeys])
            {
                if ([str isEqualToString:c])
                {
                    found = YES;
                }
            }

            if (!found)
            {
                [self.sections setValue:[[NSMutableArray alloc] init] forKey:c];
            }
        }

        }
        NSLog(@"Array Populated");
        NSLog(@"%u reports found",reportsArray.count);
        //Now you have your reportsArray filled up with all your data objects



for (NSDictionary *eachReport in arrayFromServer)
{
   [[self.sections objectForKey:[[eachReport objectForKey:@"title"] substringToIndex:3]] addObject:eachReport];
}

// Sort each section array
for (NSString *key in [self.sections allKeys])
{
    [[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]]];


}

[reportsTable reloadData];
}


-(void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    NSUInteger count = [[self.sections allKeys] count];
    NSLog(@"Number of sections: %d", count);
    return count;
}




- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    {
        NSUInteger count = [[self.sections valueForKey:[[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section]] count];
        NSLog(@"Number of rows in section: %d", count);
        return count;
    }
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        return [[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    }





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

{


    static NSString *cellIdentifier = @"Cell";



    UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell)
    {


        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

    }

        //The beauty of this is that you have all your data in one object and grab WHATEVER you like
    //This way in the future you can add another field without doing much.
    NSUInteger count = [[self.sections allKeys] count];
    if(count == 0){
        cell.textLabel.text = @"no reports to show";
    }
    else{
        NSDictionary *Reports = [[self.sections valueForKey:[[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];

        cell.textLabel.text = [Reports objectForKey:@"title"];
        cell.detailTextLabel.text = [Reports objectForKey:@"building"];



        // in the future you can grab whatever data you need like this
        //[currentReport buildingName], or [currentReport reportName];
    }


    return(cell);


    }





@end
Foi útil?

Solução

Not tested, but I think you want something like this:

Create a NSDictionary property called titleReference. Initialize it when you first create your controller

self.titleReference = [NSDictionary dictionaryWithObjectsAndKeys:
                       @"PATH OF TRAVEL", @"POT",
                       @"ANNUAL PASSIVE", @"Ann",
                       @"AUDIT", @"Aud",
                       @"CONTRACTOR AUDIT", @"CA",
                       nil];

Use it to populate an array that matches the one you've created.

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    NSArray *keys = [[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    NSMutableArray *titles = [NSMutableArray arrayWithCapacity:[keys count]];
    for (NSString *key in keys) {
        NSString *title = [self.titleReference objectForKey:key];
        if (title) {
            [titles addObject:title];
        } else {
            [titles addObject:key];
        }
    }
    return titles;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top