xcode 本地 iOS 国家/地区选择器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29695360/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Native iOS Country Picker
提问by KonDeichmann
I'm developing an app with an custom Registration Flow, where the user should set his nationality or his home Country.
我正在开发一个带有自定义注册流程的应用程序,用户应该在其中设置他的国籍或他的祖国。
My question is, if it's possible to get this information via an native ViewController like ABPeoplePickerNavigationController
for contacts.
我的问题是,是否可以通过像ABPeoplePickerNavigationController
联系人这样的本机 ViewController 获取此信息。
Should look like this (iPhone 6, iOS 8.x, contacts App 'select a Country'):
应该如下所示(iPhone 6、iOS 8.x、联系人应用“选择一个国家”):
Thanks
谢谢
采纳答案by Jakehao
回答by Anusha Kottiyal
It is very easy to make your own Country Picker
.
自己制作非常容易Country Picker
。
You can get the country list(country codes) easily from NSLocale
,
您可以从以下位置轻松获取国家/地区列表(国家/地区代码)NSLocale
,
NSArray *countryArray = [NSLocale ISOCountryCodes];
Also you will get the country name list using displayNameForKey
method,
您还将使用displayNameForKey
方法获取国家/地区名称列表,
NSLocale *locale = [NSLocale currentLocale];
NSMutableArray *sortedCountryArray = [[NSMutableArray alloc] init];
for (NSString *countryCode in countryArray) {
NSString *displayNameString = [locale displayNameForKey:NSLocaleCountryCode value:countryCode];
[sortedCountryArray addObject:displayNameString];
}
[sortedCountryArray sortUsingSelector:@selector(localizedCompare:)];
Just use the sortedCountryArray
for populating tableView
in your picker class.
只需在您的选择器类中使用sortedCountryArray
填充即可tableView
。
回答by Gil Sand
No there isn't a built-in picker for countries. Same about the classic picture reader, its the stuff you have to make yourself.
不,没有针对国家/地区的内置选择器。经典图片阅读器也是如此,它是您必须自己制作的东西。
Thankfully, it's rather easy to make and find, wether you want someone else's (lockwood is a very realiable programmer, i'm sure his CountryPicker is great).
值得庆幸的是,无论您是否想要其他人的(lockwood 是一个非常可靠的程序员,我相信他的 CountryPicker 很棒),它很容易制作和找到。
Or you can go the harder way and make one yourself from scratch.
或者你可以走更艰难的路,从头开始自己制作一个。
Note that if you have all the country codes (BE, FR, EN, NL, PT, etc.) you can find the localized name with iOS.
请注意,如果您拥有所有国家/地区代码(BE、FR、EN、NL、PT 等),则可以使用 iOS 找到本地化名称。
What I did in my code was importing a massive static dictionary of all country codes, and simply use their localized names in the tableview.
我在代码中所做的是导入一个包含所有国家/地区代码的大型静态字典,并在 tableview 中简单地使用它们的本地化名称。
This is how I got all the codes (and international prefixes, because my app needs that).
这就是我获得所有代码(和国际前缀,因为我的应用程序需要)的方式。
- (NSMutableDictionary*)dialCodeDict{
NSMutableDictionary *dialCodeDict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:
@"972", @"IL",
@"93", @"AF",
@"355", @"AL",
@"213", @"DZ",
@"1", @"AS",
@"376", @"AD",
@"244", @"AO",
@"1", @"AI",
@"1", @"AG",
@"54", @"AR",
@"374", @"AM",
@"297", @"AW",
@"61", @"AU",
@"43", @"AT",
@"994", @"AZ",
@"1", @"BS",
@"973", @"BH",
@"880", @"BD",
@"1", @"BB",
@"375", @"BY",
@"32", @"BE",
@"501", @"BZ",
@"229", @"BJ",
@"1", @"BM", @"975", @"BT",
@"387", @"BA", @"267", @"BW", @"55", @"BR", @"246", @"IO",
@"359", @"BG", @"226", @"BF", @"257", @"BI", @"855", @"KH",
@"237", @"CM", @"1", @"CA", @"238", @"CV", @"345", @"KY",
@"236", @"CF", @"235", @"TD", @"56", @"CL", @"86", @"CN",
@"61", @"CX", @"57", @"CO", @"269", @"KM", @"242", @"CG",
@"682", @"CK", @"506", @"CR", @"385", @"HR", @"53", @"CU",
@"537", @"CY", @"420", @"CZ", @"45", @"DK", @"253", @"DJ",
@"1", @"DM", @"1", @"DO", @"593", @"EC", @"20", @"EG",
@"503", @"SV", @"240", @"GQ", @"291", @"ER", @"372", @"EE",
@"251", @"ET", @"298", @"FO", @"679", @"FJ", @"358", @"FI",
@"33", @"FR", @"594", @"GF", @"689", @"PF", @"241", @"GA",
@"220", @"GM", @"995", @"GE", @"49", @"DE", @"233", @"GH",
@"350", @"GI", @"30", @"GR", @"299", @"GL", @"1", @"GD",
@"590", @"GP", @"1", @"GU", @"502", @"GT", @"224", @"GN",
@"245", @"GW", @"595", @"GY", @"509", @"HT", @"504", @"HN",
@"36", @"HU", @"354", @"IS", @"91", @"IN", @"62", @"ID",
@"964", @"IQ", @"353", @"IE", @"972", @"IL", @"39", @"IT",
@"1", @"JM", @"81", @"JP", @"962", @"JO", @"77", @"KZ",
@"254", @"KE", @"686", @"KI", @"965", @"KW", @"996", @"KG",
@"371", @"LV", @"961", @"LB", @"266", @"LS", @"231", @"LR",
@"423", @"LI", @"370", @"LT", @"352", @"LU", @"261", @"MG",
@"265", @"MW", @"60", @"MY", @"960", @"MV", @"223", @"ML",
@"356", @"MT", @"692", @"MH", @"596", @"MQ", @"222", @"MR",
@"230", @"MU", @"262", @"YT", @"52", @"MX", @"377", @"MC",
@"976", @"MN", @"382", @"ME", @"1", @"MS", @"212", @"MA",
@"95", @"MM", @"264", @"NA", @"674", @"NR", @"977", @"NP",
@"31", @"NL", @"599", @"AN", @"687", @"NC", @"64", @"NZ",
@"505", @"NI", @"227", @"NE", @"234", @"NG", @"683", @"NU",
@"672", @"NF", @"1", @"MP", @"47", @"NO", @"968", @"OM",
@"92", @"PK", @"680", @"PW", @"507", @"PA", @"675", @"PG",
@"595", @"PY", @"51", @"PE", @"63", @"PH", @"48", @"PL",
@"351", @"PT", @"1", @"PR", @"974", @"QA", @"40", @"RO",
@"250", @"RW", @"685", @"WS", @"378", @"SM", @"966", @"SA",
@"221", @"SN", @"381", @"RS", @"248", @"SC", @"232", @"SL",
@"65", @"SG", @"421", @"SK", @"386", @"SI", @"677", @"SB",
@"27", @"ZA", @"500", @"GS", @"34", @"ES", @"94", @"LK",
@"249", @"SD", @"597", @"SR", @"268", @"SZ", @"46", @"SE",
@"41", @"CH", @"992", @"TJ", @"66", @"TH", @"228", @"TG",
@"690", @"TK", @"676", @"TO", @"1", @"TT", @"216", @"TN",
@"90", @"TR", @"993", @"TM", @"1", @"TC", @"688", @"TV",
@"256", @"UG", @"380", @"UA", @"971", @"AE", @"44", @"GB",
@"1", @"US", @"598", @"UY", @"998", @"UZ", @"678", @"VU",
@"681", @"WF", @"967", @"YE", @"260", @"ZM", @"263", @"ZW",
@"591", @"BO", @"673", @"BN", @"61", @"CC", @"243", @"CD",
@"225", @"CI", @"500", @"FK", @"44", @"GG", @"379", @"VA",
@"852", @"HK", @"98", @"IR", @"44", @"IM", @"44", @"JE",
@"850", @"KP", @"82", @"KR", @"856", @"LA", @"218", @"LY",
@"853", @"MO", @"389", @"MK", @"691", @"FM", @"373", @"MD",
@"258", @"MZ", @"970", @"PS", @"872", @"PN", @"262", @"RE",
@"7", @"RU", @"590", @"BL", @"290", @"SH", @"1", @"KN",
@"1", @"LC", @"590", @"MF", @"508", @"PM", @"1", @"VC",
@"239", @"ST", @"252", @"SO", @"47", @"SJ", @"963",
@"SY",@"886",
@"TW", @"255",
@"TZ", @"670",
@"TL",@"58",
@"VE",@"84",
@"VN",
@"284", @"VG",
@"340", @"VI",
@"678",@"VU",
@"681",@"WF",
@"685",@"WS",
@"967",@"YE",
@"262",@"YT",
@"27",@"ZA",
@"260",@"ZM",
@"263",@"ZW",
nil];
return dialCodeDict;
}
And then I did this :
然后我这样做了:
- (void)viewDidLoad {
_dialCodes = [self dialCodeDict];
[self setCodes];
}
- (void)setCodes{
CTTelephonyNetworkInfo *network_Info = [CTTelephonyNetworkInfo new];
CTCarrier *carrier = network_Info.subscriberCellularProvider;
NSArray *keys = [_dialCodes allKeys];
NSArray *values = [_dialCodes allValues];
_countries = [[NSMutableArray alloc]initWithCapacity:[_dialCodes count]];
NSString *baseCountry = [_dialCodes objectForKey:carrier.isoCountryCode.uppercaseString];
for (int i = 0; i < [_dialCodes count] ; i++){
Country *c = [[Country alloc]init];
c.isoC = [keys objectAtIndex:i];
c.dialC = [values objectAtIndex:i];
c.nameC = [[NSLocale currentLocale] displayNameForKey:NSLocaleCountryCode value:c.isoC];
c.isLocal = NO;
if ([baseCountry isEqualToString:[values objectAtIndex:i]]){
c.isLocal = YES;
_myCountry = c;
}
[_countries addObject:c];
}
[_countries sortUsingComparator:^(Country *firstObject, Country *secondObject) {
return [firstObject.nameC caseInsensitiveCompare:secondObject.nameC];
}];
[self.tableView reloadData];
idx = [NSIndexPath indexPathForRow:[_countries indexOfObject:_myCountry] inSection:0];
[self.tableView selectRowAtIndexPath:idx animated:YES scrollPosition:UITableViewScrollPositionMiddle];
}
I think there is too much code for what you need but, what this does is fill a tableview of all countries and align the view to the current country (if the user has a sim card or an NSLocale)
我认为您需要的代码太多了,但是,这样做是填充所有国家/地区的 tableview 并将视图与当前国家/地区对齐(如果用户有 SIM 卡或 NSLocale)
This is how i designed the tableview :
这就是我设计 tableview 的方式:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"InternationalCell";
CustomCellInternationalTableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil){
[tableView registerNib:[UINib nibWithNibName:@"CustomCellInternationalTableViewCell" bundle:nil] forCellReuseIdentifier:cellIdentifier];
cell = [[CustomCellInternationalTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}else{
cell.lbCountry.text = [[_countries objectAtIndex:indexPath.row]nameC];
cell.lbCode.text = [NSString stringWithFormat:@"+%@",[[_countries objectAtIndex:indexPath.row]dialC]];
if ([[_countries objectAtIndex:indexPath.row]isLocal] == YES){
cell.contentView.backgroundColor = FlatGray;
}else{
cell.contentView.backgroundColor = ClearColor;
}
}
return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [_countries count];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
_myCountry = [_countries objectAtIndex:indexPath.row];
self.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self dismissViewControllerAnimated:YES completion:nil];
}
Again, there are some lines that i could remove because this is straight from my code, and because it's not well commented (my bad :D) I don't remember which would be important to you and which wouldn't ! But i'll re-read and edit if necessary.
同样,我可以删除一些行,因为这是直接从我的代码中删除的,并且因为它没有得到很好的注释(我的坏 :D)我不记得哪些对您很重要,哪些不重要!但如有必要,我会重新阅读和编辑。
回答by xtrinch
Hereis a country picker I made as a cocoapod.
这是我作为可可豆制作的国家选择器。
Usage is very simple:
用法很简单:
class ViewController: UIViewController, MRCountryPickerDelegate {
@IBOutlet weak var countryPicker: MRCountryPicker!
@IBOutlet weak var countryName: UILabel!
@IBOutlet weak var countryCode: UILabel!
@IBOutlet weak var countryFlag: UIImageView!
@IBOutlet weak var phoneCode: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
countryPicker.countryPickerDelegate = self
countryPicker.showPhoneNumbers = true
countryPicker.setCountry("SI")
}
func countryPhoneCodePicker(picker: SwiftCountryPicker, didSelectCountryWithName name: String, countryCode: String, phoneCode: String, flag: UIImage) {
self.countryName.text = name
self.countryCode.text = countryCode
self.phoneCode.text = phoneCode
self.countryFlag.image = flag
}
}