티스토리 뷰

728x90

아래 코드는 pickerView에 NSDictionary의 내용을 뿌려주는 코드입니다.
keys와 values를 사용하여 keys값이 변경되면 values값이 변경되는 간단한 프로그램입니다.

예제)



완벽한 코드가 아니기 때문에 메모리 누수가 발생 되는 부분도 있습니다. 더 좋은 방법이 있다면 댓글을 통해 알려주셨으면 합니다! 압축한 원 코드도 올려드립니다.

완전 기본적인 부분(프로젝트 생성 및 스토리보드 사용방법)은 설명하지 않겠습니다. 나중에 시간이 나면 정리를 해서 올리도록 하겠습니다.!

empty application을 실행 시키면 스토리보드가 없습니다.
새로 스토리 보드를 추가해주고,  view controller을 올리고, 그 위에 pickerView를 올렸습니다.
main storyboard 부분에 조금전에 추가한 storyboard를 선택해 줍니다. 
그리고 새로 추가한 view controller을 연결할 ui클래스를 생성합니다. 
생성된 UI클래스 이름을 아까 추가한 view controller의 custom class명으로 지정해 줍니다.
이제 추가한 picker view를 아울렛으로 연결시켜 줍니다.
AppDelegate.m 로 접근하여 아래 빨간색 부분을 주석처리해 줍니다. 주석처리 해주지 않으면 storyboard를 무시하고 아래 코드를 우선적용하여 흰색 화면이 표시됩니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//    // Override point for customization after application launch.
//    self.window.backgroundColor = [UIColor whiteColor];
//    [self.window makeKeyAndVisible];
    return YES;
}

그리고 실행을 하게되면 picker뷰는 보이지 않고 실행 될 겁니다.
pickerView의 dataSource, delegate를 view Controller로 연결해 줍니다.

일단 코드를 작성하기 전까지 준비가 되었습니다.

AppDeleget를 이용해서 새로 생성한 plist를 불러와서 NSDictionary에 저장해 줍니다.
NSString *path = [[NSBundle mainBundle] pathForResource:@"list" ofType:@"plist"];
self.pickerData = [NSDictionary dictionaryWithContentsOfFile:path];

viewController.h 파일에 아래와 같이 추가 합니다.

#import <UIKit/UIKit.h>

@class AppDelegate;
@interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView; //위에 스토리보드에서 생성한 IBOutlet 입니다.
@property (strong, nonatomic) AppDelegate *appDlg; //appDelegate를 선언합니다.
@property NSInteger nowSel; //현재 선택된 0번 셀의 값을 저장합니다.
@property (strong, nonatomic) NSArray *keys; //정렬을 위해서 array를 생성했습니다.
@end 

viewController.m 파일을 아래와 같이 추가해줍니다.(전체코드가 아닌 일부의 코드입니다.)

#import "ViewController.h"
#import "AppDelegate.h"

@implementation ViewController
@synthesize pickerView = _pickerView;
@synthesize appDlg = _appDlg;
@synthesize nowSel = nowSel;
@synthesize keys = _keys;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];
    _appDlg = [[UIApplication sharedApplication] delegate];
    //정렬을 위해 초기화 //keys는 여기서 정렬이 가능하나 values는 여기서 불가능..
    _keys = [[_appDlg.pickerData allKeys] sortedArrayUsingSelector:@selector(compare:)];
}

#pragma mark - pickerView
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 2;
}

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if(component == 0) {
        //0번 component에 해당되는 keys의 전체 카운트를 return한다.
        return [_keys count];
//        return [[_appDlg.pickerData allKeys] count]; //정렬하기 전 코드
    }

    //NSDictionary 에서 해당되는 keys에 해당대는 valueForKey를 얻기위해서 위와 같은 코드를 사용
    return [[_appDlg.pickerData valueForKey:[_keys objectAtIndex:nowSel]] count];
}

#pragma mark - pickerView @optional
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString *retStr;
    if(component == 0) {
        //0번 component 에 해당하는 keys 이름을 return
//        retStr = [[[_appDlg.pickerData allKeys] sortedArrayUsingSelector:@selector(compare:)]objectAtIndex:row];
        retStr = [_keys objectAtIndex:row];
    } else {
        //1번 component 에 해당하는 value를 구한다음 return
        retStr = [[[_appDlg.pickerData valueForKey:[_keys objectAtIndex:nowSel]] sortedArrayUsingSelector:@selector(compare:)] objectAtIndex:row];
    }
    return retStr;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if(component == 0) {
        nowSel = row; //0번째 pickerView의 선택 값을 복사
        [_pickerView reloadComponent:1]; //1번째 pickerView를 초기화
    }
}


위와 같이 작성했습니다. 

EmptyPickerView.zip






댓글