2015-04-17 105 views
7

我正在开发一个自定义注册流程的应用程序,其中用户应该设置他的国籍或他的祖国。原生iOS国家选择器

我的问题是,如果可以通过本地ViewController获取此信息,如ABPeoplePickerNavigationController的联系人。

应该是这样的(iPhone 6的iOS 8.x中,联系人应用程序 '选择国家'):

enter image description here

感谢

回答

1

我认为你必须使用,使自己的一个模态视图控制器。

另外,你可以使用这个one,它工作得很好。

1

不,没有国家的内置选取器。对于经典图片阅读器来说也是如此,它必须让你自己做的东西。幸运的是,制作和发现相当容易,你想要其他人(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)我不记得哪些对你很重要,哪些不会!但如果需要,我会重新阅读和编辑。

7

制作您自己的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在您的选取器类中。

0

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 
    } 

} 
+0

喜@Nirri ...我使用相同的帧的工作....没有ü成功运行..? –

+0

@BhaumikJoshi不知道我明白这个问题吗? – Nirri

+0

@Niri当我实现MRCountryPicker我已经实现了该git页面显示的代码好吧...现在我的问题是如何在UIViewController中assian MRCountryPickerDelegate .... –