BLOG main image
분류 전체보기 (92)
Cocoa Touch (11)
Cocoa (10)
Objective-C (13)
Swift (6)
Development (11)
Tools (11)
Books (7)
etc (21)
Application release (1)
Document Project (1)
106,090 Visitors up to today!
Today 0 hit, Yesterday 7 hit
daisy rss
tistory 티스토리 가입하기!
2008. 7. 29. 15:58
이글루에서 옮겨온 글입니다. 2007/02/10 00:48


테이블뷰 안에다 컨트롤셀을 넣었을 때 많은 사람들이 이 셀의 컨트롤에 값을 세팅하는데 어려움을 격고 있는것 같다. 코코아빌더같은 사이트에서도 질문은 많지만 적절한 답을 구하기는 쉽지 않은 것 같다. 이것은 테이블뷰의 구조에 대해서 제대로 이해하지 못해서 발생하는 현상인듯한데 얼마전 코코아의 테이블뷰와 같은 스팩으로 윈도우에서 작동 가능한 컨트롤을 만들면서 여러가지로 테이블뷰를 테스트하고 실제 코딩을 해보면서 어떻게 돌아가는지 어느정도 파악 할 수 있었다.
먼저 테이블에 들어있는 NSActionCell들(?)이 어떻게 저장되어 있는지 알 필요가 있다. 어떻게 들어있는지 알기 위해서 데이타소스의 아래 메시지에서 셀을 꺼내서 출력을 해보았다.
아뿔사... 모두 같은 어드레스를 가지고 있다. 그랬다. 테이블 뷰는 실제로는 단 하나만의 컨트롤을 가지고 있었던 것이다. 그렇다면 이것을 매 row를 표현하거나 값을 넣거나 뺄 때 위치만 바꾸면서 사용했다는 말이된다. 일단 이렇게 되면 값이 이상하게 세팅되는 것에 대한 일부분의 비밀은 풀었다.

그렇다면, 테이블뷰의 데이터는 실제로 데이터 소스에 들어있다는 대전제를 생각하면 모든 컨트롤 셀들의 값들 역시 데이터소스에 있어야 한다는 말이다.
일단 필요한 갯수만큼의 슬라이더 값을 저장할 어레이를 만들었다.
자 그러면 언제 셀에 값을 넣고 뺄 것인가?

일단 먼저 테이블뷰의 기본 사용법에 따라 앞서 열거한 두 메시지에서 셀에 값을 넣고 빼는 작업을 했다.
안된다.. 이것 좀 난감하군...
셀로 부터 변화된 값을 받을 수 없었다. 셀의 값이 바뀌었다고 - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex 메시지에서 셀의 값을 읽어봤자 원래 값만 나온다.

그렇다. 셀 역시 컨트롤이다. 타켓/액션 구조로 작동시켜 보기로 했다. 데이터소스에 액션을 추가하고 셀에 데이터소스가 타겟이라고 세팅했다. 셀의 값이 바뀔 때 적절하게 액션 메시지를 날려준다.
조금 지저분하지만 위와 같은 메시지 핸들러를 작성했다.
그러나 데이터는 정확하게 화면에 나와주지 않았다.

그렇다면 디스플레이 할때 뭔가를 해줄 수 있는 부분은 한군데 밖에 안남았다.
테이블의 딜리게이트를 역시 데이터소스라고 지정해주고 willDisplay를 이용해봤다.
아.. 이제 제대로 나온다...
더 단순한 방법이 있는지 모르겠다. 윈도우에서 보다야 엄청나게 짧은 라인으로 훨씬 많은 기능을 구현하긴 했지만 어쩐지 좀 지저분해보인다.

그래... 자라리 이렇게 할 바에는 커스텀뷰를 테이블뷰에 넣으리... 역시 액션셀은 코코아 바인딩만을 위한 장치란 말인가? 어렴풋한 기억에 의존하면 코코아 바인딩을 이용하면 이 모든 작업이 불필요해진다. 소위 glue code를 제거해준다.(그래도 나는 코코아 바인딩을 쓰고 싶지는 않다. 코드가 쓰기 편하다는 이야기는 그만큼 손댈 수 있는 여지가 적다는 말이기도 하고 코코아 바인딩은 꽤나 느린듯 하다.)

혹시 누가 더 심플한 방법을 알고 있다면 제발 좀 알려줬으면 좋겠다.
Name
Password
Homepage
Secret