2

I've got a property NSMutableArray in my view controller

ContactsViewController.h:

@interface ContactsViewController : UIViewController <UITableViewDelegate,      UITableViewDataSource>

@property (nonatomic,strong) NSMutableArray *contacts;
...
@end

In this view controller I fill my array on "viewDidLoad"

ContactsViewController.m:

@implementation ContactsViewController

@synthesize contacts;
...
...
- (void)viewDidLoad
{
  [super viewDidLoad];
  DBhandler *handler = [[DBhandler alloc] init];

  if    (contacts)
    [contacts removeAllObjects];
  else
    contacts = [[NSMutableArray alloc] init];    
  // Get all my contacts that are in my core data file
  // This function returns a NSMutableArray
  contacts=[handler getContacts];

//loop through contacts of addressbook when user wants that
if ([allContactSwitch isOn])
{

    //open link to addressbook
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
    CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );

    for( CFIndex personIndex = 0; personIndex < nPeople; personIndex++ ) {            
        ABRecordRef refVal = CFArrayGetValueAtIndex( allPeople, personIndex );            
        Boolean newContact = true;
        // check if contact is already in Core data File
        for( CFIndex i = 0; i < [contacts count]; i++ ) {
            contact *checkcontact=[contacts objectAtIndex:i];
            if (personIndex==checkcontact.personRef)
                newContact = FALSE;
        }
        if (newContact)
        {
            contact *dummycontact = [[contact alloc]init];
            dummycontact.personRef = personIndex;
            dummycontact.contactName = (__bridge NSString *)(ABRecordCopyCompositeName( refVal ));
            // Add contact to array 
            [contacts addObject:dummycontact];
        }
    }
}
// Just to check, the entire array looks fine!  
for( CFIndex i = 0; i < [contacts count]; i++ ) {
    contact *dummycontact=[contacts objectAtIndex:i];
    NSLog(@"Name after build: %@", dummycontact.contactName);
}

}

But later when the different cell for the table view are filled, the part of the NSMutableArray that came from [handle getContacts] are empty:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//NSLog(@"cell number %i",indexPath.row);
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {        
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                     reuseIdentifier:CellIdentifier];
}

// Set up the cell...
contact *dummycontact=[contacts objectAtIndex:indexPath.row];
// Only part of the objects in the array contacts contain data!
NSLog(@"Name cell: %@ %i", dummycontact.contactName, indexPath.row);

cell.textLabel.text = dummycontact.contactName;

return cell;
}

This probably has to do with the fact that the memory of the objects created in [handle getContacts] is cleared in the meantime. But I don't know how to solve this. I've tried clone or copy the output of [handle get contacts], but I wasn't successful. To be complete the function "getContacts":

-(NSMutableArray*)getContacts{

NSMutableArray *contacts = [[NSMutableArray alloc] init];

NSManagedObjectContext *context = [self managedObjectContext];
DBcontact *contact = [NSEntityDescription
                      insertNewObjectForEntityForName:@"WhappContacts"
                      inManagedObjectContext:context];
// Test listing all FailedBankInfos from the store
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"WhappContacts"
                                          inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (contact in fetchedObjects) {
   [contacts addObject:contact];
   // Data seems fine here.
   NSLog(@"Name in: %@", contact.contactName);  
}
return contacts;
}

Any help would be very appreciated!

1
  • Are you using ARC or is this a pre-ARC code? Commented Sep 2, 2012 at 14:06

1 Answer 1

0

An alternative would be to place the contact information in a dictionary:

- (NSMutableArray*)getContacts {
    NSMutableArray *contacts = [[NSMutableArray alloc] init];

    NSManagedObjectContext *context = [self managedObjectContext];
    DBcontact *contact = [NSEntityDescription insertNewObjectForEntityForName:@"WhappContacts" inManagedObjectContext:context];
    // Test listing all FailedBankInfos from the store
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"WhappContacts" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSError *error;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (contact in fetchedObjects) {
        NSDictionary *contactDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                contact.contactName, @"contactName", nil]; //add other necessary contact information

        [contacts addObject:contactDict];
        // Data seems fine here.
        NSLog(@"Name in: %@", contact.contactName);  
    }

    return contacts;
}

And to retrieve the information:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //NSLog(@"cell number %i",indexPath.row);
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {        
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Set up the cell...
    NSDictionary *dummycontact = [contacts objectAtIndex:indexPath.row];
    // Only part of the objects in the array contacts contain data!
    NSLog(@"Name cell: %@ %i", [dummycontact objectForKey:@"contactName"], indexPath.row);

    cell.textLabel.text = [dummycontact objectForKey:@"contactName"];

    return cell;
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.