2015-04-17 15 views
7

Tôi đang phát triển một ứng dụng có Quy trình Đăng ký tùy chỉnh, trong đó người dùng nên đặt quốc tịch hoặc quốc gia của mình.Bộ chọn Quốc gia iOS Gốc

Câu hỏi của tôi là, nếu có thể nhận thông tin này qua một ViewController gốc như ABPeoplePickerNavigationController cho các liên hệ.

nên giống như thế này (iPhone 6, iOS 8.x, danh bạ App 'chọn một quốc gia'):

enter image description here

Cảm ơn

Trả lời

1

Tôi nghĩ rằng bạn phải làm cho chính bạn bằng chương modal view controller.

Hoặc, bạn có thể sử dụng one, hoạt động khá tốt.

1

Không có bộ chọn được tích hợp sẵn cho các quốc gia. Tương tự về trình đọc ảnh cổ điển, đó là những thứ bạn phải tự tạo ra.

Rất may, nó khá dễ dàng để thực hiện và tìm thấy, thời tiết bạn muốn của người khác (lockwood là một lập trình rất đáng tin cậy, tôi chắc chắn CountryPicker của mình là tuyệt vời).

Hoặc bạn có thể đi theo con đường khó khăn hơn và tự làm cho mình từ đầu.

Lưu ý rằng nếu bạn có tất cả mã quốc gia (BE, FR, EN, NL, PT, v.v.), bạn có thể tìm tên được bản địa hóa bằng iOS.

Những gì tôi đã làm trong mã của tôi đã nhập khẩu một từ điển tĩnh lớn của tất cả các mã quốc gia, và chỉ đơn giản là sử dụng tên địa phương của họ trong tableview.

Đây là cách tôi nhận tất cả các mã (và tiền tố quốc tế, vì ứng dụng của tôi cần điều đó).

- (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; 
} 

Và sau đó tôi đã làm điều này:

- (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]; 
} 

Tôi nghĩ rằng có quá nhiều mã cho những gì bạn cần, nhưng điều này không là điền vào một tableview của tất cả các quốc gia và sắp xếp các điểm đến hiện tại nước (nếu người dùng có một thẻ sim hoặc một NSLocale)

Đây là cách tôi thiết kế 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]; 
} 

Một lần nữa, có một số dòng mà tôi có thể loại bỏ bởi vì điều này là trực tiếp từ mã của tôi, và bởi vì nó không được bình luận (xấu của tôi: D) Tôi không nhớ đó sẽ là quan trọng với bạn và điều đó sẽ không! Nhưng tôi sẽ đọc lại và chỉnh sửa nếu cần.

7

Nó là rất dễ dàng để làm của riêng Country Picker của bạn.

Bạn có thể lấy danh sách quốc gia (mã quốc gia) một cách dễ dàng từ NSLocale,

NSArray *countryArray = [NSLocale ISOCountryCodes]; 

Ngoài ra bạn sẽ nhận được danh sách tên quốc gia sử dụng displayNameForKey phương pháp,

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:)]; 

Chỉ cần sử dụng sortedCountryArray cho Populating tableView trong lớp người chọn của bạn.

0

Here là công cụ chọn quốc gia mà tôi đã tạo dưới dạng cocoapod.

Cách sử dụng rất đơn giản:

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

hi @Nirri ... tôi đang sử dụng khung làm việc cùng .... u đã chạy thành công ..? –

+0

@BhaumikJoshi không chắc tôi có hiểu câu hỏi không? – Nirri

+0

@Niri khi tôi triển khai MRCountryPicker tôi đã triển khai mã được hiển thị trong trang git đó ... bây giờ câu hỏi của tôi là cách hỗ trợ MRCountryPickerDelegate trong UIViewController .... –

Các vấn đề liên quan