'ObjC'에 해당되는 글 2건

  1. 2015.02.11 앱 실행 중 언어 설정 변경
  2. 2014.07.22 [ChopeTableController] v0.3.0
Programming/iOS2015.02.11 15:35

다국어 지원을 위해 NSLocalizedString 을 하면 아이폰 디바이스의 언어 설정으로 문자열을 가져옵니다.

만약 앱 안에서 언어 설정을 변경하고 싶다면 어떻게 해야 할까??


검색을 해보면 가장 많이 나오는 방법은 아래와 같다.


[[NSUserDefaults standardUserDefaults] setObject:@[ @"ko" ] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];


NSLocalizedString이 AppleLanguages에 설정된 언어에서 가져오므로 잘 동작한다.

하지만 문제는 앱을 재 실행해야 한다는 것이다. 설정 하나 바꿨다고 앱을 재 실행하라고??


내가 찾은 방법은 다국어를 가져올때 특정 언어 Bundle에서 가져오도록 하는 것이다.


NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"ko"];
NSBundle *localizableBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];
NSLocalizedStringFromTableInBundle(key, nil, localizableBundle, nil);


위 코드에서는 디바이스 언어와 상관없이 모두 한국어로 다국로 문자열을 가져오게 하였습니다.

이 코드를 적용해도 바로 화면의 언어들이 변경되지는 않을 것 입니다.

추가 적으로 뷰를 새로 그려지게 하면 됩니다. 언어를 일일이 다시 설정하는 방법도 있겠지만..... 전 window.rootViewController를 새로 설정했습니다.


AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
appDelegate.window.rootViewController = viewController;


이제 설정할때마다 새로 화면을 불러와서 원하는 언어대로 표시합니다~!


신고
Posted by 초프(초보 프로그래머)
Project/OpenSource2014.07.22 12:12

 v0.3.0

  • Cell에 표시할 data를 cellInfo에서 분리
  • cellInfo 설정 매소드 추가
  • data 설정 매소드 추가
  • 테스트 코드 변경


ChopeTableController

It is not subclass of UITableViewController.

Implemention of UITableViewDataSource, UITableViewDelegate.


@interface CPSimpleTableViewCell : UITableViewCell 

@property (nonatomic, weak) IBOutlet UILabel *titleLabel;

@end

@implementation CPSimpleTableViewCell

- (void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];
    
    [self.titleLabel setTextColor:[UIColor whiteColor]];
}

+ (CGFloat)heightForCell:(id)data indexPath:(NSIndexPath *)indexPath {
    return 40 + (indexPath.row+1);
}

- (void)updateData:(id)data indexPath:(NSIndexPath *)indexPath {
    [self.titleLabel setText:data];
    [self setNormalBackgroundColor:indexPath];
}

- (void)setNormalBackgroundColor:(NSIndexPath *)indexPath {
    if (indexPath.row % 2 == 0) {
        [self setBackgroundColor:[UIColor darkGrayColor]];
    }
    else {
        [self setBackgroundColor:[UIColor purpleColor]];
    }
}

- (void)selectedWithData:(id)data indexPath:(NSIndexPath *)indexPath {
    [self setBackgroundColor:[UIColor blueColor]];
}

- (void)deselectedWithData:(id)data indexPath:(NSIndexPath *)indexPath {
    [self setNormalBackgroundColor:indexPath];
}

- (void)highlightedWithData:(id)data indexPath:(NSIndexPath *)indexPath {
    [self setBackgroundColor:[UIColor redColor]];
}

- (void)unhighlightedWithData:(id)data indexPath:(NSIndexPath *)indexPath {
    [self setNormalBackgroundColor:indexPath];
}

@end


Create ChopeTableController 

self.tableController = [[ChopeTableController alloc] init];


Set Table Information

ChopeTableInfo *tableViewInfo = [self.tableController addTableInfo:self.tableView paging:NO];
[tableViewInfo addCellClass:[CPSimpleTableViewCell class] cellIdentifier:CELL_IDENTIFIER_LABEL];
[tableViewInfo setDidLoadCellBlock:^(ChopeTableInfo *tableInfo, id <ChopeTableCellDelegate> cellDelegate, NSIndexPath *indexPath) {
        CPSimpleTableViewCell *cell = (CPSimpleTableViewCell *) cellDelegate;
        cell.button.tag = indexPath.row;
        [cell.button addTarget:self action:@selector(touchTestButton:) forControlEvents:UIControlEventTouchUpInside];
}];
[tableViewInfo setDidSelectRowBlock:^(ChopeTableInfo *cpTableInfo, NSIndexPath *indexPath) {
        NSLog(@"selected cell : %d", indexPath.row);
}];

paging:YES is not tested.


Add Data

cell information is about one cell.

  • Cell Class
  • Cell identifier


for (NSUInteger i=1; i<=100; i++) {
    [tableViewInfo addData:[NSString stringWithFormat:@"item - %d", i] cellIdentifier:CELL_IDENTIFIER_LABEL];
}


Screenshot



Github

https://github.com/chope-yoonhg84/ChopeTableController


신고
Posted by 초프(초보 프로그래머)