我正在開發一個自定義註冊流程的應用程序,其中用戶應該設置他的國籍或他的祖國。原生iOS國家選擇器
我的問題是,如果可以通過本地ViewController獲取此信息,如ABPeoplePickerNavigationController
的聯繫人。
應該是這樣的(iPhone 6的iOS 8.x中,聯繫人應用程序 '選擇國家'):
感謝
我正在開發一個自定義註冊流程的應用程序,其中用戶應該設置他的國籍或他的祖國。原生iOS國家選擇器
我的問題是,如果可以通過本地ViewController獲取此信息,如ABPeoplePickerNavigationController
的聯繫人。
應該是這樣的(iPhone 6的iOS 8.x中,聯繫人應用程序 '選擇國家'):
感謝
我認爲你必須使用,使自己的一個模態視圖控制器。
另外,你可以使用這個one,它工作得很好。
不,沒有國家的內置選取器。對於經典圖片閱讀器來說也是如此,它必須讓你自己做的東西。幸運的是,製作和發現相當容易,你想要其他人(Lockwood是一位非常可靠的程序員,我確定他的CountryPicker很棒)。
或者你可以更艱難的方式,從頭開始自己做。
請注意,如果您擁有所有國家/地區代碼(BE,FR,EN,NL,PT等),則可以在iOS中找到本地化名稱。
我在我的代碼中所做的工作是導入一個包含所有國家/地區代碼的大型靜態字典,並且只需在tableview中使用它們的本地化名稱即可。
這就是我得到所有代碼(和國際前綴,因爲我的應用程序需要)。
- (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;
}
然後,我這樣做:
- (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];
}
我覺得有太多的代碼,你需要什麼,但是,這樣做是填補所有國家的實現代碼如下並對齊查看到當前國家(如果用戶有一個SIM卡或NSLocale)
這是我的設計實現代碼如下:
- (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];
}
再次,我可以刪除一些行,因爲這是直接從我的代碼,並且因爲它沒有很好的評論(我的壞:D)我不記得哪些對你很重要,哪些不會!但如果需要,我會重新閱讀和編輯。
製作您自己的Country Picker
非常容易。
您可以從NSLocale
獲得國家列表(國家代碼)很容易,
NSArray *countryArray = [NSLocale ISOCountryCodes];
而且你會得到使用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:)];
只需使用sortedCountryArray
用於填充tableView
在您的選取器類中。
Here是我作爲椰子樹做的國家選擇器。
用法很簡單:
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
}
}
喜@Nirri ...我使用相同的幀的工作....沒有ü成功運行..? –
@BhaumikJoshi不知道我明白這個問題嗎? – Nirri
@Niri當我實現MRCountryPicker我已經實現了該git頁面顯示的代碼好吧...現在我的問題是如何在UIViewController中assian MRCountryPickerDelegate .... –