IOS native builder

I am developing an application with a custom registration flow where the user must establish their nationality or their home country.

My question is, is it possible to get this information through my own ViewController, for example ABPeoplePickerNavigationController for contacts.

It should look like this (iPhone 6, iOS 8.x, contacts App 'select country'):

enter image description here

thanks

+7
ios objective-c iphone xcode swift
source share
4 answers

I think you need to make your own using a modal view controller.

Alternatively, you can use this one that works quite well.

+1
source share

It is very easy to make your own Country Picker .

You can easily get a list of countries (country codes) with NSLocale ,

 NSArray *countryArray = [NSLocale ISOCountryCodes]; 

You will also get a list of country names using the displayNameForKey method,

 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 sortedCountryArray to populate the tableView in your select class.

+7
source share

There is no built-in collector for countries. The same goes for the classic image reader, his material, which you must do yourself.

Fortunately, this is pretty easy to do and find if you want someone else (lockwood is a very realistic programmer, I'm sure his CountryPicker is great).

Or you can go in a more complicated way and do it yourself.

Please note that if you have all country codes (BE, FR, EN, NL, PT, etc.), you can find the localized name with iOS.

What I did in my code was to import a massive static dictionary of all country codes and simply use their localized names in the table view.

This is how I got all the codes (and international prefixes, because my application needs it).

 - (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 it does is fill the table of all countries and align the view to the current country (if the user has a SIM card or NSLocale)

This is how I designed 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 delete, because it is directly from my code, and because it is not very commented out (my bad: D), I do not remember what would be important for you and what would not ! But I will re-read and edit if necessary.

+1
source share

Here is a country picker that I made as a coco port.

Using 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 } } 
0
source share

All Articles