我的应用程序中的tableView中有一个地址簿数据。此代码在模拟器中成功运行。我在模拟器中获取了我的应用程序的tableView中的联系人数据,但是当我在我的设备中测试它时,联系人的数据没有得到。我使用6.1模拟器和iPhone设备ios 6.1.3。请告诉我这段代码中的实际问题是什么? 此代码在模拟器中成功运行,但它的代码未在iPhone设备iOS 6.1.3中运行
谢谢你
ClsMainPageAppDelegate.h
#import <UIKit/UIKit.h>
#import "Person.h"
@interface ClsMainPageAppDelegate : UIResponder <UIApplicationDelegate>
{
}
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) Person *objPerson;
@end
ClsMainPageAppDelegate.m
#import "ClsMainPageAppDelegate.h"
#import "ClsMainPageViewController.h"
@implementation ClsMainPageAppDelegate
@synthesize objPerson;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
}
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSString *fullName;
@property (nonatomic, strong) NSString *phoneNumber;
@property (nonatomic, strong) NSString *workEmail;
@end
Person.m
#import "Person.h"
@implementation Person
- (id)init
{
self = [super init];
if (self)
{
}
return self;
}
@end
ClsAddressBookViewController.h
#import <UIKit/UIKit.h>
@interface ClsAddressBookViewController : UIViewController
- (IBAction)backcontacts:(id)sender;
@end
ClsAddressBookViewController.m
#import "ClsAddressBookViewController.h"
#import "ClsUpdateNetworkViewController.h"
#import "ClsMainPageAppDelegate.h"
#import "Person.h"
#import <AddressBook/AddressBook.h>
@interface ClsAddressBookViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) NSMutableArray *tableData;
@end
@implementation ClsAddressBookViewController
@synthesize tableData;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"Contacts";
self.tableData = [[NSMutableArray alloc]init];
[self getPersonOutOfAddressBook];
}
- (void)getPersonOutOfAddressBook
{
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (addressBook != nil)
{
NSLog(@"Succesful.");
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i < [allContacts count]; i++)
{
Person *person = [[Person alloc] init];
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
person.firstName = firstName;
person.lastName = lastName;
person.fullName = fullName;
//Mobile Number
ABMultiValueRef mobilenum = ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);
NSUInteger k = 0;
for(k = 0; k < ABMultiValueGetCount(mobilenum); k++)
{
NSString *mobile = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(mobilenum, k);
if(k == 0)
{
person.phoneNumber = mobile;
NSLog(@"person.mobilenum = %@", person.phoneNumber);
}
else if (k==1)
person.phoneNumber = mobile;
}
[self.tableData addObject:person];
}
}
CFRelease(addressBook);
}
#pragma mark TableView Delegate
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.tableData count];
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
Person *person = [self.tableData objectAtIndex:indexPath.row];
cell.textLabel.text = person.fullName;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Person *person = [self.tableData objectAtIndex:indexPath.row];
ClsMainPageAppDelegate *objdelegate = [[UIApplication sharedApplication]delegate];
objdelegate.objPerson = person;
UIStoryboard *storybrd = self.storyboard;
ClsAddressBookViewController *svc = [storybrd instantiateViewControllerWithIdentifier:@"clsUpdatecontrol"];
[self presentViewController:svc animated:YES completion:nil ];
}
答案 0 :(得分:1)
从IOS 6.它需要授权您的应用访问系统数据: 在保密性标签和联系人部分的IPhone设置中,验证您的应用是否已访问
答案 1 :(得分:1)
要继续TDelepine的建议,可能在您的getPersonOutOfAddressBook方法中,您可以检查您的应用是否具有AddressBook访问权限。如果尚未确定访问状态,下面的代码将强制设备要求用户访问:
...
NSLog(@"Succesful.");
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
if(granted) {
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
etc...
}
});
}
答案 2 :(得分:1)
我认为您没有发送访问地址簿的请求。另一件事如果您没有使用它,那么它在模拟器中正常工作但在iPhone中无法正常工作
在ViewDidLoad中使用此代码
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// dispatch_release(sema);
}
else { // we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted) {
// Do whatever you want here.
}