본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] UITableView 편집

by 돼지왕 왕돼지 2016. 2. 21.
반응형


 [iOS Study] UITableView 편집


출처 : 아론 힐리가스의 iOS 프로그래밍



DataSource, editing, editingStyle, file's owner, footer, header, insertRowsAtIndexPaths: withRowAnimation:, ios programming, ios study, ios tutorial, isediting, isEqual, isEqual:, loadnibnamed:owner:options:, mainbundle, No, None, nsbundle, NSIndexPath, NSMutableArray, removeObject, removeObjectIdenticalTo, removeObjectIdenticalTo:, secgtion header, section footer, Self, Simulated Metrics, Size, strong, swipe delete, table footer, table header, tableview, tableView:canMoveRowAtIndexPath:, tableView:commitEditingStyle:forRowAtIndexPath:, tableView:moveRowAtIndexPath:toIndexPath:, tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:, tutorial, UITableView, UITableViewCellEditingStyle, UITableViewCellEditingStyleDelete, UITableViewController, UITableViewDataSource, UITableViewRowAnimationFade, UITableViewRowAnimationTop, UIView, View, viewcontroller, XIB, YES, [iOS Study] UITableView 편집, 녹색, 더하기 버튼, 삭제, 순서 번경, 스와이프 삭제, 아론 힐리가스, 아카이브, 테이블뷰, 편집 모드, 헤더, 확장자



-

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 을 선택하면 된다.









반응형

댓글