ios - 如何仅获取设备上每个联系人的第一个电话号码?
<p><p>我有一个显示设备上所有联系人姓名的表格 View 。这些名称来自一个名为 <code>contactsArray</code> 的数组。对于每个 <code>contact</code> 对象,我将获取 <code>phoneNumbers</code> 对象并将号码放入另一个名为 <code>phoneNumberArray</code> 的数组中。当我将它们放入我的表格 View 时,它会显示每个联系人及其对应的号码......但只有这么长时间。当我下来几十行时,数字不再与正确的联系人匹配,因为一些 <code>contact</code> 对象包含一个具有多个电话号码的 <code>phoneNumbers</code> 对象。如何仅获取每个对象的第一个电话号码,以便拥有相同数量的联系人和电话号码?</p>
<p>这是我的代码:</p>
<pre><code> @property (nonatomic, strong) NSMutableArray *contactsArray;
@property (nonatomic, strong) NSMutableArray *phoneNumberArray;
@end
@implementation Contacts
- (void)viewDidLoad
{
;
self.phoneNumberArray = [init];
self.contactsArray = [init];
;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
returnself.contactsArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId = @"contactCell";
ContactCell *cell = ;
CNContact *contact = self.contactsArray;
NSString *phone = self.phoneNumberArray;
NSString *contactName = ;
NSString *contactNumber = phone;
cell.name.text = contactName;
cell.number.text = contactNumber;
;
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 72;
}
-(void)fetchContactsandAuthorization
{
// Request authorization to Contacts
CNContactStore *store = [ init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted == YES)
{
CNContactStore *addressBook = [init];
NSArray *keysToFetch =@[CNContactFamilyNameKey,
CNContactGivenNameKey,
CNContactPhoneNumbersKey];
CNContactFetchRequest *fetchRequest = [initWithKeysToFetch:keysToFetch];
[addressBook enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
;
NSString *phone;
for (CNLabeledValue *label in contact.phoneNumbers) {
phone = ;
if ( > 0) {
;
}
}
}];
dispatch_async(dispatch_get_main_queue(), ^{
;
});
}
}];
}
@end
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>您的方法的问题是您正在创建一个全局电话号码数组,然后将所有电话号码添加到其中。相反,您只想添加第一个电话号码。 </p>
<p>我会修改以下代码:</p>
<pre><code>for (CNLabeledValue *label in contact.phoneNumbers) {
phone = ;
if ( > 0) {
;
break;
}
}
if (contact.phoneNumbers.count == 0) {
;
}
</code></pre>
<p>现在逻辑已经改变:</p>
<ol>
<li>我们将每个用户添加到一个数组中</li>
<li>在电话号码数组中,我们只添加其对应的第一个号码</li>
<li>现在我们的两个数组直接链接了。最后值得检查的是,电话号码数组始终与用户数组具有相同的计数</li>
<li>我们调用 break 退出</li>
</ol>
<p>有了这个新功能 - 并在 3 中有所提及。我们需要添加更多检查。例如,如果用户没有任何电话号码怎么办 - 在这种情况下,我们需要添加一个空白电话号码以确保号码适合联系人。 </p>
<pre><code>if () {
;
}
</code></pre>
<p>上面还有另一个可能的检查 - 如果我们遍历所有电话号码并且不添加号码,那么我们无论如何都会添加一个空白号码。您需要查看您的数据并查看您可能遇到的不同情况。 </p>
<p><strong>替代解决方案:</strong> </p>
<p>上述解决方案是让您的代码正常工作的快速解决方案 - 尽管我个人不是这种方法的忠实粉丝 - 如果您想为每个代码使用多个数字怎么办?如果你想点击一个用户查看所有号码怎么办?在构建代码时,值得考虑如何确保以后可以更轻松地对其进行重构。</p>
<p>不会有所不同(Coredata 和对象等)我希望为每个联系人提供一个字典数组。该数组将存储他们的详细信息(姓名、电话号码等),并且可以在每个单元格中轻松访问。</p>
<pre><code>[addressBook enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
NSMutableArray * phoneNumbersTemp = ;
for (CNLabeledValue *label in contact.phoneNumbers) {
phone = ;
if ( > 0) {
;
}
}
NSDictionary * contactDict = @{name: contact.name,
phoneNumbers: phoneNumbersTemp}
;
}];
</code></pre>
<p><strong>注意:</strong>这是sudo代码,没有经过测试——是为了高亮方法</p>
<p>然后,这种代码将允许您访问每个单元格中的第一个电话号码(只需获取每个用户的联系人电话字典并获取第一个条目),还允许您为高级功能构建一个联系人对象。 </p></p>
<p style="font-size: 20px;">关于ios - 如何仅获取设备上每个联系人的第一个电话号码?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/47785039/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/47785039/
</a>
</p>
页:
[1]