2

ビューコントローラーにプロパティ NSMutableArray があります

ContactsViewController.h:

@interface ContactsViewController : UIViewController <UITableViewDelegate,      UITableViewDataSource>

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

このView Controllerでは、「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);
}

}

ただし、後でテーブル ビューの別のセルが入力されると、[handle getContacts] から取得した NSMutableArray の部分は空になります。

- (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;
}

これはおそらく、[handle getContacts] で作成されたオブジェクトのメモリがその間にクリアされるという事実に関係しています。しかし、これを解決する方法がわかりません。[handle get contacts] の出力を複製またはコピーしようとしましたが、成功しませんでした。関数 "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;
}

どんな助けでも大歓迎です!

4

1 に答える 1

0

別の方法は、連絡先情報を辞書に入れることです。

- (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;
}

情報を取得するには:

- (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;
}
于 2013-08-21T07:23:49.983 に答える