通过人员选择器添加数据,但UITableView不会重新加载

时间:2015-06-06 12:36:06

标签: ios objective-c uitableview

我创建了一个带有单元格的UITableView,我试图通过某些功能将一个人的手机和名称信息添加到单元格中。问题是当我尝试添加一个人的信息时,它被添加到我的数据数组中,但是,我无法在UITableView单元格上看到新信息。我试图用reloadData函数重新加载UITableView,没用。

我有人数和姓名的数组。此外,我有一个按钮,通过 ABPeoplePickerNavigationController 添加一个人。 addedContacts.h:

#import <UIKit/UIKit.h>
@import AddressBook;
@import AddressBookUI;

@interface addedContacts : UIViewController <UITextFieldDelegate, ABPeoplePickerNavigationControllerDelegate, UITableViewDelegate,
UITableViewDataSource>{
    NSMutableArray* people;
    NSMutableArray* numbers;
    IBOutlet UITableView *tableview;
}
- (IBAction)addPerson:(id)sender;

@end

我使用 commitEditingStyle 功能从tableview中删除某人的信息。此外,我将人们的信息保留在应用程序的默认值中。

addedContacts.m:

#import "addedContacts.h"

@implementation addedContacts

-(void)viewDidLoad{
    [super viewDidLoad];

}

- (IBAction)addPerson:(id)sender {
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    [self presentViewController:picker animated:YES completion:nil];
}

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
    [self dismissViewControllerAnimated:YES completion:nil];

}

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

    numbers = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"numbers"]];
    people =  [[NSMutableArray alloc]  initWithArray:[defaults objectForKey:@"people"]];

    if(numbers.count == 0 && numbers.count == 0){
        numbers = [[NSMutableArray alloc] init];
        people =  [[NSMutableArray alloc] init];

    }

    NSString *contactName = CFBridgingRelease(ABRecordCopyCompositeName(person));
    NSString* nameField = [NSString stringWithFormat:@"%@", contactName ? contactName : @"No Name"];
    ABMultiValueRef phoneRecord = ABRecordCopyValue(person, kABPersonPhoneProperty);
    CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phoneRecord, 0);
    NSString* phoneField = (__bridge_transfer NSString *)phoneNumber;
    CFRelease(phoneRecord);

    [people addObject:nameField];
    [numbers addObject:phoneField];

    [defaults setObject:people forKey:@"people"];;
    [defaults setObject:numbers forKey:@"numbers"];
    [self dismissViewControllerAnimated:YES completion:nil];
    return NO;
}

-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Remove the row from data model
    [people removeObjectAtIndex:indexPath.row];
    [numbers removeObjectAtIndex:indexPath.row];

    // Request table view to reload
    [tableView reloadData];

}


-(NSInteger) numberOfSectionsInTableView: (UITableView*) tableView{
    return 1;
}

-(NSInteger) tableView:(UITableView*) tableView numberOfRowsInSection:(NSInteger)section{
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    numbers = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"numbers"]];
    return [numbers count];
}

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

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    numbers = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"numbers"]];
    people = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"people"]];
    NSLog(@"%@",numbers);
    NSLog(@"%@",people);
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        cell.accessoryType = UITableViewCellAccessoryDetailButton;
    }

    NSLog(@"%ld", (long)indexPath.row);
    NSLog(@"%ld", (long)people.count);

    NSString* Tname = [people objectAtIndex:indexPath.row];
    NSString* Tnumber = [numbers objectAtIndex:indexPath.row];
    cell.textLabel.text = Tname;
    cell.detailTextLabel.text = Tnumber;

    return cell;
}

@end

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

1)这有点奇怪:

if(numbers.count == 0 && numbers.count == 0){
    numbers = [[NSMutableArray alloc] init];
    people =  [[NSMutableArray alloc] init];

}
我认为你的意思是

if(numbers.count == 0 && people.count == 0)

2)我认为在将新对象添加到人员和数字数组

之后,你会重新插入表格
[people addObject:nameField];
[numbers addObject:phoneField]; 
[tableView reloadData];

答案 1 :(得分:0)

我的预感是,这是tableView:numberOfRowsInSection代码中的一个错误。您需要返回peoplenumbers的计数。没有从用户默认值中获取值。因为他们没有新添加的人和号码。

-(NSInteger) tableView:(UITableView*) tableView numberOfRowsInSection:(NSInteger)section{
    return [numbers count];
}