我有一个应用程序,从他们的联系人列表中选择一个人,并采取他们的名字,姓氏和电子邮件.然后它将第一个名称保存到nsmutablearray并将其放入uitableview单元格中.一旦在模拟器中选择了联系人,我的问题就出现了.
码:
.H:
#import <UIKit/UIKit.h> #import <AddressBookUI/AddressBookUI.h> @interface FirstViewController : UIViewController < ABPeoplePickerNavigationControllerDelegate,UITableViewDelegate,UITableViewDataSource> - (IBAction)showPicker:(id)sender; @property (weak,nonatomic) IBOutlet NSString *firstName; @property (weak,nonatomic) IBOutlet NSString *email; @property (weak,nonatomic) IBOutlet NSString *lastName; @property (weak,nonatomic) IBOutlet UITableView *myTableView; @property (strong,nonatomic) NSMutableArray *contacts; @end
.M:
#import "FirstViewController.h" @interface FirstViewController () @end @implementation FirstViewController @synthesize firstName; @synthesize email; @synthesize lastName; @synthesize contacts; @synthesize myTableView; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view,typically from a nib. contacts = [[NSMutableArray alloc]initWithObjects:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - UITableView Datasource -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return contacts.count; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.text = [contacts objectAtIndex:indexPath.row]; return cell; } - (IBAction)showPicker:(id)sender { ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.peoplePickerDelegate = self; [self presentModalViewController:picker animated:YES]; } - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { [self dismissModalViewControllerAnimated:YES]; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { [self displayPerson:person]; [self dismissModalViewControllerAnimated:YES]; return NO; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { return NO; } - (void)displayPerson:(ABRecordRef)person { NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty); self.firstName = name; NSString* last = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty); self.lastName = last; ABMultiValueRef emails = ABRecordCopyValue(person,kABPersonEmailProperty); NSString *emailId = (__bridge NSString *)ABMultiValueCopyValueAtIndex(emails,0);//0 for "Home Email" and 1 for "Work Email". self.email = emailId; if (!(contacts)) { contacts = [[NSMutableArray alloc]init]; } [contacts insertObject:firstName atIndex:0]; NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; [self.myTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } @end
解决方法
UITableView必须始终与数据源保持同步.如果数据源可以在后台线程中更改,则必须特别小心.
当某些内容添加到数据源时,请尽快调用beginUpdate / insert / endUpdate.您不必担心缓存这些,UITableView会在确定有足够的cpu时间和资源时缓存要执行的更改.
调用endUpdates时,UITable将再次询问dataSource的节数和行数.如果直接来自dataSource的节和行的数量,则数字节和行,加上插入,减去删除必须等于numberOfSections和numberOfRowsInSection的结束调用返回的数字.
最后一个提示:避免混合调用’reloadData’和beginUpdate / endUpdate对.使用其中一个,而不是两个.