본문 바로가기
아이폰 개발/ios 개념&튜토리얼

ios coredata로 게시판 만들기 - 수정

by 인생여희 2020. 12. 16.

ios coredata로 게시판 만들기 - 수정

 

저번포스팅에 이어서 이번에는 테이블 뷰 셀을 눌렀을 때 수정할 수 있도록, 팝업창이 뜨고, 수정내용을 입력하고 저장하면 수정내용이 저장되는 부분을 구현해보자.

 

 

1.테이블 셀 클릭이벤트

테이블뷰 셀을 클릭했을 때, 기존 데이터가 팝업창으로 뜨고, 내용을 수정해 저장하면 context에 저장한다. 일단 기존의 데이터를 팝업창으로 먼저 띄워보자. 셀이 클릭되었을때 호출되는 메소드는 didSelectRowAtIndexPath 메소드 이다. 전체 코드는 아래와 같다.

 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //1.수정될 Board 객체
    Board *object = self.list[indexPath.row];
    
    //2.기존 제목
    NSString *title =  [object valueForKey:@"title"];
    
    //3.기존 내용
    NSString *contents = [object valueForKey:@"contents"];
    
    //4.팝업 객체생성
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"게시글 수정" message:@"게시글을 수정해주세요." preferredStyle:UIAlertControllerStyleAlert];
    
    //5.텍스트 필드에 기존 데이터 값 대입
    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.text = title;
    }];
    
    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.text = contents;
    }];
    
    
    //6.수정버튼 생성
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"수정" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            
        NSLog(@"수정 -");
        
        //6-1. 수정된 데이터
        NSString *titleModify = alert.textFields.firstObject.text;
        NSString *contentsModify = alert.textFields.lastObject.text;
        
        //6-2. 수정 처리
        BOOL result =  [self edit:object title:titleModify contents:contentsModify];
       
        //6-3. 수정 성공
        if (result) {
            
            //6-4. list 배열 갱신
            [self fetchAllData];
           
            
            //6-5. 테이블 뷰 cell 리로드
            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
            cell.textLabel.text = titleModify;
            cell.detailTextLabel.text = contentsModify;
        
            NSIndexPath *firstIndex = [NSIndexPath indexPathForItem:0 inSection:0];
            [self.tableView moveRowAtIndexPath:indexPath toIndexPath:firstIndex];
        }
        
    }];
    
    //7.취소 버튼 생성
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"취소" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"취소 - ");
    }];
    
    //8.버튼들 팝업 객체에 할당
    [alert addAction:ok];
    [alert addAction:cancel];
    
    //9. 띄워주기
    [self presentViewController:alert animated:YES completion:nil];
}

 

2. 수정내용 저장

위에서 수정내용을 입력하고 저장을 클릭했다. 하지만 실제로 데이터베이스에 저장된것은 아니다. 메모리상에서만 변경되었기 때문에 저장되어 보일 뿐이다. 실제로 저장을 할려면 NSManagedObjectContext 객체를 이용해서 save 해주어야 한다. 

NSManagedObjectContext 객체는 AppDelegate에 구현되어 있기 때문에 AppDelegate 변수를 이용해서 NSManagedObjectContext 에 저장한다.

 

//수정 처리 메소드
-(BOOL)edit:(Board *) object title:(NSString*) title contents : (NSString*) contents{
 
    //현재 날짜.
    NSDate *today = [NSDate date];
    
    //1.넘겨 받은 수정된 데이터(Board 객체)
    object.title = title;
    object.contents = contents;
    object.regdate = today;
    
    
    //2.로그 객체 생성
    Log *logObject = [NSEntityDescription insertNewObjectForEntityForName:@"Log" inManagedObjectContext:self.context];
    
    logObject.regdate = today;
    logObject.type = 1;

    
    //3.Board에 Log 객체 할당
    [object addLogsObject:logObject];
    
    @try {
        //4.메모리에 변경된 부분 저장
        [self.delegate saveContext];
        
        NSLog(@"수정 완료 - saveContext");
        
        return YES;
        
    } @catch (NSException *exception) {
        
        NSLog(@"exception : %@" , [exception description]);
        
        [self.delegate rollBack];
        
        return NO;
    }
    
    
}

 

3.재조회

수정 데이터를 context에 저장했으면 테이블 데이터를 아래와 같이 재조회 해준다.

 

//데이터 전체 조회
-(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];
}

 

4.완성

 

완성

 

예제파일

 

CoreDataTest.zip
0.06MB

 

연재 포스팅

ios 코어데이터 예제(feat: 기초 개념)

ios coredata로 게시판 만들기 - 조회

ios coredata로 게시판 만들기 - 저장

ios coredata로 게시판 만들기 - 삭제