
企业微信20250102-141744@2x.png
BTCountryCodeController.h
//
// BTCountryCodeController.h
// BiteLive
//
// Created by ZSP on 2025/1/2.
//
#import "BaseViewController.h"
typedef void(^returnCountryCodeBlock) (NSString * _Nullable countryName, NSString * _Nullable code);
@protocol BTCountryCodeControllerDelegate <NSObject>
@optional
/**
Delegate 回调所选国家代码
@param countryName 所选国家
@param code 所选国家代码
*/
-(void)returnCountryName:(NSString *_Nullable)countryName code:(NSString *_Nullable)code;
@end
NS_ASSUME_NONNULL_BEGIN
@interface BTCountryCodeController : BaseViewController
@property (nonatomic, weak) id<BTCountryCodeControllerDelegate> deleagete;
@property (nonatomic, copy) returnCountryCodeBlock returnCountryCodeBlock;
@end
NS_ASSUME_NONNULL_END
BTCountryCodeController.m
//
// BTCountryCodeController.m
// BiteLive
//
// Created by ZSP on 2025/1/2.
//
#import "BTCountryCodeController.h"
//判断系统语言
#define CURR_LANG ([[NSLocale preferredLanguages] objectAtIndex:0])
#define LanguageIsEnglish ([CURR_LANG isEqualToString:@"en-US"] || [CURR_LANG isEqualToString:@"en-CA"] || [CURR_LANG isEqualToString:@"en-GB"] || [CURR_LANG isEqualToString:@"en-CN"] || [CURR_LANG isEqualToString:@"en"])
@interface BTCountryCodeController () <UITableViewDataSource,UITableViewDelegate,UISearchResultsUpdating> {
UITableView *_tableView;
UISearchController *_searchController;
NSDictionary *_sortedNameDict;
NSArray *_indexArray;
NSMutableArray *_results;
}
@end
@implementation BTCountryCodeController
#pragma mark - system
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = @"国家代码";
[self creatSubviews];
}
#pragma mark - private
//创建子视图
- (void)creatSubviews{
_results = [NSMutableArray arrayWithCapacity:1];
// _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, self.view.bounds.size.width, self.view.bounds.size.height-20) style:UITableViewStylePlain];
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
[self.view addSubview:_tableView];
[_tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view);
make.bottom.mas_equalTo(self.view);
make.right.mas_equalTo(self.view);
make.left.mas_equalTo(self.view);
}];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.rowHeight = 44.0;
_tableView.backgroundColor = UIColor.clearColor;
_tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
// _searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
// _searchController.searchResultsUpdater = self;
// _searchController.obscuresBackgroundDuringPresentation = NO;
//
// UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, _tableView.bounds.size.width, _searchController.searchBar.bounds.size.height)];
// [headerView addSubview:_searchController.searchBar];
// _tableView.tableHeaderView = headerView;
//判断当前系统语言
if (LanguageIsEnglish) {
NSString *plistPathEN = [[NSBundle mainBundle] pathForResource:@"sortedNameEN" ofType:@"plist"];
_sortedNameDict = [[NSDictionary alloc] initWithContentsOfFile:plistPathEN];
} else {
NSString *plistPathCH = [[NSBundle mainBundle] pathForResource:@"sortedNameCH" ofType:@"plist"];
_sortedNameDict = [[NSDictionary alloc] initWithContentsOfFile:plistPathCH];
}
_indexArray = [[NSArray alloc] initWithArray:[[_sortedNameDict allKeys] sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2];
}]];
}
- (NSString *)showCodeStringIndex:(NSIndexPath *)indexPath {
NSString *showCodeSting;
if (_searchController.isActive) {
if (_results.count > indexPath.row) {
showCodeSting = [_results objectAtIndex:indexPath.row];
}
} else {
if (_indexArray.count > indexPath.section) {
NSArray *sectionArray = [_sortedNameDict valueForKey:[_indexArray objectAtIndex:indexPath.section]];
if (sectionArray.count > indexPath.row) {
showCodeSting = [sectionArray objectAtIndex:indexPath.row];
}
}
}
return showCodeSting;
}
- (void)selectCodeIndex:(NSIndexPath *)indexPath {
NSString * originText = [self showCodeStringIndex:indexPath];
NSArray * array = [originText componentsSeparatedByString:@"+"];
NSString * countryName = [array.firstObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString * code = array.lastObject;
if (self.deleagete && [self.deleagete respondsToSelector:@selector(returnCountryName:code:)]) {
[self.deleagete returnCountryName:countryName code:code];
}
if (self.returnCountryCodeBlock != nil) {
self.returnCountryCodeBlock(countryName,code);
}
_searchController.active = NO;
[_searchController.searchBar resignFirstResponder];
if (self.navigationController) {
[self.navigationController popViewControllerAnimated:YES];
} else {
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
NSLog(@"选择国家: %@ 代码: %@",countryName,code);
}
#pragma mark - UISearchResultsUpdating
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
if (_results.count > 0) {
[_results removeAllObjects];
}
NSString *inputText = searchController.searchBar.text;
__weak __typeof(self)weakSelf = self;
[_sortedNameDict.allValues enumerateObjectsUsingBlock:^(NSArray * obj, NSUInteger idx, BOOL * _Nonnull stop) {
[obj enumerateObjectsUsingBlock:^(NSString * obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj containsString:inputText]) {
__strong __typeof(weakSelf) strongSelf = weakSelf;
[strongSelf->_results addObject:obj];
}
}];
}];
[_tableView reloadData];
}
#pragma mark - UITableViewDelegate && UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if (_searchController.isActive) {
return 1;
} else {
return [_sortedNameDict allKeys].count;
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (_searchController.isActive) {
return [_results count];
} else {
if (_indexArray.count > section) {
NSArray *array = [_sortedNameDict objectForKey:[_indexArray objectAtIndex:section]];
return array.count;
}
return 0;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *identifier = @"identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
cell.textLabel.font = [UIFont systemFontOfSize:16.0];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
cell.textLabel.text = [self showCodeStringIndex:indexPath];
return cell;
}
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView {
if (tableView == _tableView) {
return _indexArray;
}else{
return nil;
}
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
if (tableView == _tableView) {
return index;
} else{
return 0;
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (tableView == _tableView) {
if (section == 0) {
return 0;
}
return 30;
} else {
return 0;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if (_indexArray.count && _indexArray.count > section) {
return [_indexArray objectAtIndex:section];
}
return nil;
}
#pragma mark - 选择国际获取代码
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self selectCodeIndex:indexPath];
}
@end
具体使用:
#import "BTCountryCodeController.h"
//遵守代理
//<BTCountryCodeControllerDelegate>
//选择国际代码
-(void)clickCountryCode{
NSLog(@"clickCountryCode==");
BTCountryCodeController *countryCodeVC = [[BTCountryCodeController alloc] init];
// countryCodeVC.deleagete = self;
__weak __typeof(self)weakSelf = self;
countryCodeVC.returnCountryCodeBlock = ^(NSString *countryName, NSString *code) {
__strong __typeof(weakSelf) strongSelf = weakSelf;
// strongSelf-> _countryCodeLable.text = [NSString stringWithFormat:@"国家: %@ 代码: %@",countryName,code];
strongSelf-> _countryCodeLable.text = [NSString stringWithFormat:@"+%@",code];
NSLog(@"00国家: %@ 代码: %@",countryName,code);
strongSelf.countryCode = code;
};
// [self.viewController.navigationController pushViewController:countryCodeVC animated:YES];
[self.viewController.navigationController presentViewController:countryCodeVC animated:YES completion:nil];
}
#pragma mark - XWCountryCodeControllerDelegate
- (void)returnCountryName:(NSString *)countryName code:(NSString *)code {
NSLog(@"11国家: %@ 代码: %@",countryName,code);
// showCodeLB.text = [NSString stringWithFormat:@"国家: %@ 代码: %@",countryName,code];
}
参考文档:
https://github.com/qxuewei/XWCountryCode
https://gitcode.com/gh_mirrors/xw/XWCountryCode/overview?utm_source=artical_gitcode&index=top&type=card&webUrl=&null