[iOS Study] UITableView 편집 |
출처 : 아론 힐리가스의 iOS 프로그래밍
-
UITableView 는 editing 프로퍼티를 가지고 이 프로퍼티가 YES 이면 편집 모드로 진입한다.
일단 테이블뷰가 편집 모드에 진입하면 테이블의 행들은 사용자에 의해 조작 가능하다.
테이블뷰가 어떻게 설정됐는지에 따라 사용자는 행을 추가하거나 삭제하고 순서를 변경할 수 있다.
그러나 편집 모드에서 사용자가 행의 내용까지 편집할 수는 없다.
-
테이블뷰는 헤더라는 단어를 두 가지 방식으로 사용한다.
테이블 헤더와 섹션 헤더가 있다.
푸터도 마찬가지로 테이블 푸터와 섹션 푸터가 있다.
-
XIB 파일을 불러 들여오는 view 는 strong 으로 프로퍼티를 준다.
XIB 파일에서 상위 레벨 객체가 되기 때문이다.
-
XIB 파일은 보통 뷰 컨트롤러의 뷰를 만드는 데 사용되지만, 또한 뷰 객체들을 배치하고 아카이브하여 실행할 때 그 객체들을 불러오는 데 사용될 수도 있다.
-
XIB 파일을 수동으로 로드하기 위해 NSBundle 을 사용한다.
이 클래스는 앱과 그 앱 번들 사이의 인터페이스이다.
앱 번들에서 파일에 접근하고 싶으면 NSBundle 에 요청한다.
NSBundle 인스턴스는 앱이 시작할 때 만들어지고, mainBundle 메시지를 NSBundle 에 보내면 이 인스턴스의 포인터를 얻을 수 있다.
-
[[NSBundle mainBundle] loadNibNamed:@“xibName” owner:self options:nil];
XIB 파일을 불러올 때 파일명에 확장자를 사용하지 않는다.
NSBundle 이 알아내기 때문이다.
self 를 XIB 파일의 소유자로 전달한다.
이것은 실행 시에 메인 NSBundle 이 NIB 파일을 분석할 때 해당 인스턴스를 XIB 파일의 File’s Owner 로 설정한다는 의미이다.
-
XIB 은 뷰 객체들을 아카이브하는 용도로도 사용할 수 있다.
어떤 객체든 앱 번들에 loadNibNamed:owner:options: 메시지를 보내서 수동으로 XIB 파일을 로드할 수 있다.
-
UITableView 의 editing 프로퍼티는 직접 토글할 수 있다.
반면 UITableViewController 도 editing 프로퍼티를 가지고 있다.
UITableViewController 인스턴스는 소유한 editing 프로퍼티와 맞추기 위해 자동으로 테이블뷰의 editing 프로퍼티를 설정한다.
따라서 뷰 컨트롤러의 editing 프로퍼티를 설정하려면 setEditing:animated: 메시지를 뷰 컨트롤러에 보내야 한다.
cf) ViewController 에는 isEditing property 가 있다.
-
실행 중에 테이블 뷰에 행을 추가할 수 있는 일반적인 인터페이스가 두 가지 있다.
테이블 뷰의 셀들 위쪽에 놓인 버튼.
녹색 더하기 기호를 가진 셀.
-
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop]; 을 통해 TableView 에 Row 를 추가할 수 있다.
단, UITableView 와 그 dataSource 가 행의 수에 동의하는지 확인해야 한다.
새 행을 추가하기 전에 dataSource 에 먼저 추가해야 한다.
다시 말하자면.. 뷰 객체의 역할은 사용자에게 모델 객체를 표시하는 것임을 명심해야 한다.
모델 객체가 바뀌지 않는 한 뷰 객체를 갱신하는 것은 별 소용없는 일이다.
-
NSMutableArray의 removeObjectIdenticalTo: 와 removeObject: 메소드.
removeObject: 메소드는 배열 내의 모든 객체에 isEqual: 을 보내서 참인 경우 삭제한다.
클래스는 isEqual: 메소드를 정의에 따라 YES 나 NO 를 반환하도록 구현할 수 있다.
removeObjectIdenticalTo: 는 이 메시지에 전달된 객체와 정확히 동일한 객체인 경우에만 그 객체를 삭제한다.
-
UITableView 가 Edit 모드일 때 - 버튼이 눌리면 ( 스와이프(swipe)로도 삭제 가능하다. )
데이터 소스에 tableView:commitEditingStyle:forRowAtIndexPath: 메시지가 두 개의 추가 인자가 함께 전달된다.
첫 번째는 UITableViewCellEditingStyle 로 이 경에는 UITableViewCellEditingStyleDelete 이다.
다른 인자는 테이블에서 행의 NSIndexPath 이다.
다음과 같은 코드를 작성하면 된다.
if(editingStyle == UITableViewCellEditingStyleDelete){
...
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
-
UITableView 에서 행의 순서를 바꾸기 위해 UITableViewDataSource 프로토콜의 tableView:moveRowAtIndexPath:toIndexPath: 메소드를 사용한다.
행을 이동하는 것은 확인이 필요하지 않다. ( 이동하는 코드 구현이 필요 없다. )
테이블뷰는 스스로 행을 이동하고 데이터 소스에 이동을 알리기 위해 tableView:moveRowAtIndexPath:toIndexPath: 메시지를 보낸다.
단지 새로운 순서를 일치시키기 위해 데이터 소스를 갱신하도록 이 메소드를 구현하면 된다.
이 녀석을 구현하는 것만으로도 3개의 줄이 나오고, 위치를 바꿀 수 있으며, 위치를 바꿀 경우 이 함수가 불린다.
-
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
를 통해서 위치를 바꿀 때 예외처리를 할 수 있다.
-
tableView:canMoveRowAtIndexPath:
를 통해서 특정 아이템이 위치를 바꿀 수 있는지 YES, NO 를 return 하여 설정할 수 있다.
cf) XIB 에서 UIView 의 크기를 조절하길 원한다면, Simulated Metrics 섹션 아래의 Size 옵션에서 None 을 선택하면 된다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS Study] 카메라 (0) | 2016.02.23 |
---|---|
[iOS Study] UINavigationController (0) | 2016.02.22 |
[iOS Study] UITableView 와 UITableViewController (0) | 2016.02.20 |
[iOS Study] 델리게이션과 텍스트 입력 (0) | 2016.02.19 |
[iOS Study] 뷰 컨트롤러 (0) | 2016.02.18 |
댓글