.스토리보드 없이 CRUD - Update
안녕하세요. 오늘은 CRUD 중 하나인 데이터를 수정하는 Update를 구현해보는 시간을 갖도록 하겠습니다.
역시 이전 CRUD 포스팅들을 읽고 오셔야 코드의 흐름과 의미를 파악하실 수 있으니 다음의 포스팅들을 먼저 읽고 오시는 것을 추천드립니다.
Update를 구현하기 위해 저는 Create를 구현할 때 사용했던 EditFriendViewController
를 사용할 것입니다. 그리고 다음의 절차를 통해 코드를 작성해나가도록 할 것입니다.
tableView(_:didSelectRowAt:)
구현
- Update를 위한
editFriend
클로저 구현
- 수정할 친구의 정보를 생성자의 인자로 넘겨야하기 때문에
EditFriendViewController
생성자 추가
- Update를 위한
EditFriendViewController
코드 수정
그럼 본격적으로 시작해보도록 하겠습니다.
1. tableView(_:didSelectRowAt:)
먼저 친구 연락처 목록이 있는 화면에서 수정할 연락처 셀을 선택하면 해당 정보를 수정할 수 있는 화면으로 넘어가야 합니다. 그러기 위해서는 먼저 MainViewController
에서 tableView(_:didSelectRowAt:)
을 구현해주어야 합니다.
- 기본적으로 테이블 뷰의 셀을 터치하면 다른 셀을 터치하기 전까지 진한 회색으로 선택된 셀을 보여줍니다. 하지만 저는 바로 셀이 원래의 색으로 돌아오게끔 하기위해 셀이 선택되면 선택을 해제하는 코드를 넣어준 것입니다.
- 여기서 Create와의 차이점을 확인하실 수 있습니다. Create를 구현할 때는
EditFriendViewController
를 생성하고 present할 때 생성자의 인자로 아무것도 넘겨주지 않았습니다. Update를 할 때는 어떤 데이터를 Update할지를 넘겨주어야 하기 때문에 다음과 같이 생성자의 변수로 넘깁니다. 이렇게 되면 EditFriendViewController
의 생성자를 추가해주어야 하는데 이는 밑에서 추후에 다루도록 하겠습니다.
이렇게 먼저 기본적인 tableView(_:didSelectRowAt:)
을 구현했습니다.
2. editFriend
클로저 구현
Create를 구현할 때와 마찬가지로 Update 역시 기존에 사용하던 editFriend
를 다르게 구현하여 Update를 구현하도록 하겠습니다.
Update와 Create의 차이점은 데이터의 추가가 아닌 데이터의 수정입니다. 그러므로 다음과 같이 코드를 작성합니다.
- Create와의 차이점이 보이시나요? 바로
.append
를 사용한 것이 아닌 수정을 위해 선택되어진 셀의 해당하는 데이터에 수정된 데이터를 덮어 씌운것입니다.
그럼 이제 위에서 언급했듯이 EditFriendViewController
의 생성자를 만들어보도록 하겠습니다.
3. EditFriendViewController
Initializer
위에서 보았듯이 Update를 할 때는 EditFriendViewController
를 수정할 데이터를 인자로 넣어 생성합니다. 그럼 다음과 같은 생성자를 만들 수 있습니다.
- 넘어온 친구의 정보를 담고 있어야하는 변수를 선언합니다. 하지만 Create를 할 때는 넘어오지 않기 때문에 옵셔널로 선언합니다.
- 생성자를 추가합니다. 내부적으로 슈퍼 클래스의 생성자도 호출해주어야 합니다.
하지만 단순히 이렇게 구현한다면 컴파일러는 에러를 발생시킬 것입니다. 그러면서 어떤 코드를 추가하라는 에러 메시지를 띄울 것이고 Fix를 누르게 되면 다음과 같은 생성자가 추가될 것입니다.
required
키워드가 붙은 생성자는 단어 뜻 그대로 반드시 구현해야하는 생성자입니다. 하지만 여러분은 평소에 UIViewController
들을 사용할 때 위와 같은 생성자를 구현한 적이 없을 것입니다. 그 이유는 자식 클래스에서 따로 생성자를 만들지 않으면 기본적으로 슈퍼 클래스의 생성자, 즉 required init?()
이 그대로 사용되기 때문입니다. 자식 클래스에서 따로 생성자를 만들지 않게 되면 위의 생성자를 구현할 필요가 없습니다.
생성자에 관한 더 자세한 내용은 추후에 포스팅할 예정입니다.
이렇게 생성자가 추가되면 Create에서 작성했던 코드도 수정이 필요합니다. 생성자를 새로 만들었기 때문에 인자를 넘기지 않아 현재는 오류를 발생시킬 것입니다. 다음과 같이 코드를 수정해줍니다.
- 추가하는 화면으로 넘어갈 떄는 데이터를 넘길 필요가 없기 때문에
nil
을 넣어준다.
이렇게 EditFriendViewController
의 생성자를 추가해보았습니다. 이제 나머지 코드들을 작성하면서 완성해보도록 하겠습니다.
4. EditFriendViewController
우리는 EditFriendViewController
가 생성되었을 때 friend
의 유무로 Create인지 Update인지 알 수 있습니다.
먼저 title
부터 간단하게 바꿔보도록 하겠습니다.
다음으로는 tableView(_: cellForRowAt:)
을 수정해보도록 하겠습니다. Create일 때는 빈 TextField에 Placeholder만 보여주었지만 Update에서는 수정될 데이터를 보여주어야 합니다.
friend
가 존재한다면 해당 객체의 내용을 TextField에 보여주는 코드입니다.
마지막으로 저장하는 메소드인 save
를 수정하겠습니다.
- Update일 경우 넘어온
friend
의 정보만 바꾸어 수정하고, Create일 경우는 새로운 Friend
객체를 만들어 추가하는 것입니다. 이는 Update인지 Create인지에 따라 MainViewController
에서 작성한 서로 다른 내용의 editFriend
가 실행되는 것입니다.
마무리
오늘은 이렇게 CRUD 중 Update를 구현해보았습니다. 사실 아직 부족한게 많습니다. 데이터가 수정되고 추가될 때 기존의 데이터들과의 중복 검사도 해야하고 현재는 어플리케이션이 종료되면 모든 데이터가 사라지기 때문에 영구적으로 저장하는 것도 구현해야합니다. 하지만 이런 것들은 CRUD 중 마지막인 Delete를 구현한 후 마저 추가해보도록 하겠습니다. 감사합니다.
Source : github
Next : [ios] 스토리보드 없이 CRUD - Delete