- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发名片阅读器应用程序。当我读取一张卡片时,我从 OCR 输出中得到一个字符串对象。我将字符串与其他字符串分开,例如姓名、地址、电话号码、电子邮件和网址。但我的问题是我无法在 ABNewPersonViewController
类的相应字段中发送这些字符串。
最佳答案
见下面的代码。这是一个详细的代码。
-(NSUInteger)addNewContacts_InAddressBook:(NSMutableArray*)contactsToBeAdded
{
int numContacts=[contactsToBeAdded count];
if (numContacts==0)
{
return 0;
}
int32_t uniqueId;
@try
{
ABAddressBookRef iphoneAddressBook=ABAddressBookCreate();
CFErrorRef error = NULL;
if(!iphoneAddressBook)
{
DLog(@"unable to open addressBook");
return 0;
}
NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"yyyy-MM-dd"];
[inFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSAutoreleasePool* pool=[[NSAutoreleasePool alloc] init];
NSMutableArray *recordRefArray=[[NSMutableArray alloc] initWithCapacity:numContacts];
BOOL shouldReleasePool=NO;
NSAutoreleasePool *innerPool=nil;
for(int j=0;j<numContacts;j++)
{
if((j&255)==0)
{
innerPool= [[NSAutoreleasePool alloc] init];
shouldReleasePool=YES;
}
Contact *objContact=[contactsToBeAdded objectAtIndex:j];
ABRecordRef newPerson = ABPersonCreate();
if(objContact.mPrefixName!=nil)
{
if([objContact.mPrefixName isEqualToString:@""]==FALSE)
{
ABRecordSetValue(newPerson, kABPersonPrefixProperty, (CFStringRef)objContact.mPrefixName , &error);
}
}
if(objContact.mFirstName!=nil)
{
if([objContact.mFirstName isEqualToString:@""]==FALSE)
{
ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (CFStringRef)objContact.mFirstName , &error);
}
}
if(objContact.mMiddleName!=nil)
{
if([objContact.mMiddleName isEqualToString:@""]==FALSE)
{
ABRecordSetValue(newPerson, kABPersonMiddleNameProperty, (CFStringRef)objContact.mMiddleName , &error);
}
}
if(objContact.mLastName!=nil)
{
if([objContact.mLastName isEqualToString:@""]==FALSE)
{
ABRecordSetValue(newPerson, kABPersonLastNameProperty, (CFStringRef)objContact.mLastName , &error);
}
}
if(objContact.mNickName!=nil)
{
if([objContact.mNickName isEqualToString:@""]==FALSE)
{
ABRecordSetValue(newPerson, kABPersonNicknameProperty, (CFStringRef)objContact.mNickName , &error);
}
}
if(objContact.mSuffixName!=nil)
{
if([objContact.mSuffixName isEqualToString:@""]==FALSE)
{
ABRecordSetValue(newPerson, kABPersonSuffixProperty, (CFStringRef)objContact.mSuffixName , &error);
}
}
// Storing user photo into address book
if(objContact.mUserPhotoData)
{
if ([objContact.mUserPhotoData length] > 0)
ABPersonSetImageData(newPerson, (CFDataRef)objContact.mUserPhotoData, &error);
}
ContactProperty *objContactProperty;
int numProps=[objContact.mPropertyArray count];
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMutableMultiValueRef multiUrl = ABMultiValueCreateMutable(kABMultiStringPropertyType);
NSMutableDictionary *addressDictionary=[[NSMutableDictionary alloc] init];
ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
BOOL notFirstTime=NO;
int currentPropertyIndex=-1;
NSString *displayName;
ABMutableMultiValueRef multiDate = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMutableMultiValueRef multiIM = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
NSMutableDictionary *IMDictionary;
for(int i=0;i<numProps;i++)
{
objContactProperty=[objContact.mPropertyArray objectAtIndex:i];
int PID=objContactProperty.mContactPropId;
// if([objContactProperty.mContactDataType compare:@"Text"]==NSOrderedSame)
//{
if (PID==3)
{
if(objContactProperty.mContactPropertyString)
{
// DLog(@"Saving Into AddressBook: Label : %@ Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
ABRecordSetValue(newPerson, kABPersonOrganizationProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
}
}
// }
///\/\/\/\/\/\/\/\/
if(PID==1901)
{
if(objContactProperty.mContactPropertyString)
{
// DLog(@"Saving Into AddressBook: Label : %@ Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
ABRecordSetValue(newPerson, kABPersonNoteProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
}
}
if(PID==4)
{
if(objContactProperty.mContactPropertyString)
{
// DLog(@"Saving Into AddressBook: Label : %@ Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
ABRecordSetValue(newPerson, kABPersonFirstNamePhoneticProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
}
}
if(PID==5)
{
if(objContactProperty.mContactPropertyString)
{
// DLog(@"Saving Into AddressBook: Label : %@ Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
ABRecordSetValue(newPerson, kABPersonLastNamePhoneticProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
}
}
if(PID==6)
{
if([objContactProperty.mContactPropertyString length]>=1)
{
// DLog(@"Saving Into AddressBook: Label : %@ Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
ABRecordSetValue(newPerson, kABPersonJobTitleProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
}
}
if(PID==7)
{
if(objContactProperty.mContactPropertyString)
{
// DLog(@"Saving Into AddressBook: Label : %@ Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
ABRecordSetValue(newPerson, kABPersonDepartmentProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
}
}
//Adding phone numbers
//if([objContactProperty.mContactDataType compare:@"Phone"]==NSOrderedSame)
if(PID>10 && PID<=200)
{
// if(objContactProperty.mContactPropertyString)
// {
// DLog(@"Label : %@ Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
ABMultiValueAddValueAndLabel(multiPhone, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
// }
}
//Adding emails
// if([objContactProperty.mContactDataType compare:@"Email"]==NSOrderedSame)
if(PID>300 && PID<=320)
{
ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, @"home", NULL);
}
else if(PID>320 && PID<=340)
{
ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, @"work", NULL);
}
else if(PID>340 && PID<=400)
{
ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
}
//Adding web URLs
// if([objContactProperty.mContactDataType compare:@"Url"]==NSOrderedSame)
if(PID>500 && PID<=600)
{
// if(objContactProperty.mContactPropertyString)
// {
ABMultiValueAddValueAndLabel(multiUrl, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
// }
}
//ADDRESSES
if (PID>700 && PID<=1300)
{
int propertyIndex=(PID-1)/10; //To adjust for 710 to fall into category of (710-1)/10=70 instead of 71.
if (propertyIndex!=currentPropertyIndex)
{
if (notFirstTime)
{
bool didAddAddress;
if(currentPropertyIndex*10<901)
didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABHomeLabel, NULL);
else if(currentPropertyIndex*10<1101)
didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL);
else
didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, displayName, NULL);
[addressDictionary release];
addressDictionary = [[NSMutableDictionary alloc] init];
}
currentPropertyIndex=propertyIndex;
notFirstTime=YES;
}
displayName=[NSString stringWithString:objContactProperty.mDisplayName];
switch (PID%10)
{
case 1:
[addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonAddressStreetKey];
break;
case 2:
[addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressCityKey];
break;
case 3:
[addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressStateKey];
break;
case 4:
[addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressZIPKey];
break;
case 5:
[addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressCountryKey];
break;
default:
break;
}
}
//DATE AND BIRTHDAY
NSDate *ddate;
if (PID>1400 && PID<=1500)
{
switch (PID)
{
case 1401:
ddate=[inFormat dateFromString:[objContactProperty.mContactPropertyString substringToIndex:10]];
ABRecordSetValue(newPerson, kABPersonBirthdayProperty, ddate , &error);
break;
default:
ddate=[inFormat dateFromString:[objContactProperty.mContactPropertyString substringToIndex:10]];
ABMultiValueAddValueAndLabel(multiDate, ddate, (CFStringRef)objContactProperty.mDisplayName, NULL);
break;
}
}
//INSTANT MESSAGE
if (PID>1600 && PID<=1800)
{
switch (PID%2)
{
case 1:
IMDictionary=[[NSMutableDictionary alloc] init];
[IMDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonInstantMessageUsernameKey];
break;
case 0:
[IMDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonInstantMessageServiceKey];
ABMultiValueAddValueAndLabel(multiIM, IMDictionary, (CFStringRef)objContactProperty.mDisplayName, NULL);
[IMDictionary release];
default:
break;
}
}
}
if ([addressDictionary count]!=0)
{
bool didAddAddress;
NSRange range1,range2;
range1=[displayName rangeOfString:@"home" options:NSCaseInsensitiveSearch];
range2=[displayName rangeOfString:@"work" options:NSCaseInsensitiveSearch];
if (range1.location!=NSNotFound)
didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABHomeLabel, NULL);
else if (range2.location!=NSNotFound)
didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL);
else
didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, (CFStringRef)displayName, NULL);
}
[addressDictionary release];
ABRecordSetValue(newPerson, kABPersonAddressProperty, multiAddress, NULL);
CFRelease(multiAddress);
DLog(@"Saving Phone Numbers");
ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone,nil);
CFRelease(multiPhone);
ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail,nil);
CFRelease(multiEmail);
ABRecordSetValue(newPerson, kABPersonURLProperty, multiUrl,nil);
CFRelease(multiUrl);
ABRecordSetValue(newPerson, kABPersonDateProperty, multiDate,nil);
CFRelease(multiDate);
ABRecordSetValue(newPerson, kABPersonInstantMessageProperty, multiIM, NULL);
CFRelease(multiIM);
bool outcome=ABAddressBookAddRecord(iphoneAddressBook, newPerson, &error);
#ifdef ENABLE_DEBUG_CONSOLE_OUTPUT
if(outcome==FALSE)
DLog(@"RECORD COULD NOT BE ADDED TO THE ADDRESSBOOK");
#endif
[recordRefArray addObject:newPerson];
CFRelease(newPerson);
if(shouldReleasePool)
{
[innerPool release];
shouldReleasePool=NO;
}
}
DLog(@"Saving AddressBook");
DBManager *dbManager=[DBManager getInstance];
[dbManager setFLAGIsSavingAddressBook:YES];
bool outcome=ABAddressBookSave(iphoneAddressBook, &error);
[dbManager setFLAGIsSavingAddressBook:NO];
[[NSNotificationCenter defaultCenter] postNotificationName:ADDRESSBOOK_DONE_SAVING object:nil];
#ifdef ENABLE_DEBUG_CONSOLE_OUTPUT
if(outcome==FALSE)
DLog(@"ADDRESSBOOK COULD NOT BE SAVED");
#endif
for(int i=0;i<numContacts;i++)
{
uniqueId=ABRecordGetRecordID([recordRefArray objectAtIndex:i]);
Contact *objContact=[contactsToBeAdded objectAtIndex:i];
objContact.addressBookId=uniqueId;
DLog(@"Adding multiple records at once. The LID for the newly added record is: %i",uniqueId);
}
[recordRefArray release];
//Initializing new addressBook id in contact
//objContact.addressBookId=uniqueId;
CFRelease(iphoneAddressBook);
[pool release];
[inFormat release];
}
@catch (NSException * e)
{
DLog(@"Exception in addNewContactInAddressBook ");
}
@finally {
}
return 0;
//
return uniqueId;
}
关于iphone - 如何将字符串对象传递给 ABNewPersonViewController.h 的名称字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13011412/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!