ios coredata로 게시판 만들기 - 저장
지난 포스팅에 이어서 이번에는 네비게이션 헤더 부분에 bar button item을 만들어서 클릭하면 팝업 창이 뜨고, 팝업창에 게시글의 제목과 내용을 작성해서 저장 할 수 있도록 진행을 해보자.
1.bar button 생성
ListVC 컨트롤러 우측 상단에 bar button item을 추가하고, ListVC.m과 연결시켜 준다.
2. UIAlertController 팝업 띄우기
위의 add 버튼을 누르면 아래 코드가 작동된다. 아래 코드는 제목과 게시 내용을 입력할 수 있는 팝업창이 뜨고, 입력을 하고 저장을 누르면 core data에 저장 되고, 다시 coredata에서 데이터를 조회하는 로직이다.
- (IBAction)addAction:(id)sender {
NSLog(@"addAction - ");
//1.팝업창
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"게시글 등록" message:@"개시글을 등록해 주세요." preferredStyle:UIAlertControllerStyleAlert];
//2.저장버튼
UIAlertAction *ok = [UIAlertAction actionWithTitle:@"저장" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//텍스트 필드 데이터 가져오기
NSString * title = alert.textFields.firstObject.text;
NSString * contents = alert.textFields.lastObject.text;
//**게시글 저장 !!
BOOL result = [self save:title contentsOne:contents];
NSLog(@"result(저장결과) : %@", (result ? @"YES" : @"NO")); //output : YES
//테이블 뷰 초기화
if (result) {
NSLog(@" 테이블 뷰 초기화 ");
[self fetchAllData];
}
}];
//3.취소버튼
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"취소" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"취소");
}];
//4.버튼 추가
[alert addAction:ok];
[alert addAction:cancel];
//5.텍스트 필드 추가
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"title";
}];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"contents";
}];
//6.띄우기
[self presentViewController:alert animated:YES completion:nil];
}
3.CoreData 저장
팝업 창에서 저장을 눌렀을때 저장될 제목 데이터와 내용 데이터를 받아서 Board 객체로 만들고, Log 객체로 만든 다음에 context(DAO)에 save 해준다. 저장 성공하면 context에 save를 해주고, 실패하면 rollback을 해준다.
-(BOOL)save:(NSString *) title contentsOne : (NSString *) contents {
//현재 날짜.
NSDate *today = [NSDate date];
//1. 관리 객체 생성 & 값 설정
Board *object = [NSEntityDescription insertNewObjectForEntityForName:@"Board" inManagedObjectContext:self.context];
[object setValue:title forKey:@"title"];
[object setValue:contents forKey:@"contents"];
[object setValue:today forKey:@"regdate"];
//2. Log 관리 객체 생성 + 속성에 값 대입
Log *logObject = [NSEntityDescription insertNewObjectForEntityForName:@"Log" inManagedObjectContext:self.context];
[logObject setValue:today forKey:@"regdate"];
[logObject setValue:0 forKey:@"type"]; //생성
//3. 게시글 객체의 logs 속성에 새로 생성된 로그 객체 추가
[object addLogsObject:logObject];
@try {
//4.영구 저장소에 커밋되면 list 프로퍼티에 Board 추가
[self.delegate saveContext];
NSLog(@"저장 완료 ");
return YES;
} @catch (NSException *exception) {
NSLog(@"exception : %@" , [exception description]);
[self.delegate rollBack];
return NO;
}
}
4.데이터 재조회(리로드)
저장이 성공하면 재조회 함수에서 coredata Board 객체에 접근해서 다시 전체 데이터를 조회해서 table View에 뿌려준다.
//데이터 전체 조회
-(void)fetchAllData{
//3.요청 객체 생성
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Board"];
//3-1. 정렬 속성
NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"regdate" ascending:NO];
[fetchRequest setSortDescriptors:@[sort]];
//4.데이터 가져오기
self.list = [self.context executeFetchRequest:fetchRequest error:nil];
[self.tableView reloadData];
}
5.완성
xcode를 실행하면 아래와 같은 팝업이 보이고 저장을 누르면 글이 저장된 것을 확인할 수가 있다.
예제파일
이전포스팅
참고(GCD,apple 문서)
https://meetup.toast.com/posts/88
http://seorenn.blogspot.com/2012/04/ios.html
'아이폰 개발 > ios 개념&튜토리얼' 카테고리의 다른 글
ios coredata로 게시판 만들기 - 수정 (0) | 2020.12.16 |
---|---|
ios coredata로 게시판 만들기 - 삭제 (0) | 2020.12.16 |
ios coredata로 게시판 만들기 - 조회 (0) | 2020.12.15 |
iOS Photos Framework로 아이폰 사진앱 만들기 (0) | 2020.12.15 |
iOS Photos Framework 정리 (PhotoKit) (0) | 2020.12.14 |