티스토리 뷰

반응형

안녕하세요 :)

오늘은 뭘 해볼거냐면, 제목에도 나와있듯이 하나의 Delegate에 여러개의 요소들이 연결될 수 있느냐? 있다면 그 방법은 무엇인지를 배워볼게요.

(요소..?라고 표현해도 되는지 모르겠는데, 뭔가 이 표현말고 어케 말해야할지 모르겠네요.......이 요소는 TableView, CollectionView, PickerView를 말합니다.)

자 저의 질문이 나갑니다. 

스크롤 내리지마시고, 한번 대답해보세요.


Q : TableView에 내가 원하는 데이터들을 넣는 작업을 하려면 Delegate와 DataSource를 채택해야합니다. 그러나, 현재 "하나"의 View에 TableView가 2개 있습니다. 



바로 이렇게 말이죠. 

저는 각각의 TableVIew에 다른 내용을 넣고싶습니다. 어떻게해야할까요?


자.. 한번 생각해보세요. 어떻게 할 수 있을까요? 

하나의 View에 TableView가 2개라니;;;꼭 TableView로 생각하지 않아도 됩니다. CollectionView, PickerView로 생각하셔도돼요. 


생각해보셨나요? 

저도 이게 가능한지 몰랐을 때는, 

아니;;;Delegate나 Datasource는 특정한 TableView(또는 CollectionView, PickerView)에 대한 함수가 아니잖아? 지금 View에 있는 모든 것에 영향을 줘서 TableView(또는 CollectionView, PickerView)들이 똑같아 질 것 같은데..?

라고 생각했답니다. 


하지만 결론부터 말씀드리면, 가능합니다!!

위 그림처럼 TableView가 2개 있어도 셀 갯수, 내용등이 달라지게 할 수 있어요 :)

같이 해보러 가봅시다. 예제는 TableView만 해볼건데,  CollectionView, PickerView도 똑같습니다 :) 


아직 TableView Delegate, DataSource를 잘 모르신다면, <TableView - Delegate,DataSource>이 글을 읽고와주세요. 




같은 클래스에서 하나의 Delegate로 여러개의 TableView다루기




1. IBOutlet연결과 Delegate,DataSource extension.





지금 딱 이렇게까지 해준 상태에요. 위에있는게 topTableView, 밑에있는게 bottomTableView에요.

cell의 Identifier지정도 해주었어요. topTableView와 bottomTableView를 같게 주었습니다. cell로요. -> 이 부분 기억해두세요. 



2. 대리자 위임


대리자 위임과정도 해줄게요. 두번 해줘야겠죠? TableView가 2개니까요!



3. DataSource함수 구현. 

자, 지금은 이렇게 되어있는 상태죠? 

일단, TableView에 같은 내용을 보여줄게요. 즉, 일단은 두 TableView를 같게 만들어보겠다는 소리에요!


어..그래서 일단 row개수는 3개로 줬고, cell도 "cell"이라는 Identifier를 가진 TableView셀을 리턴해줄게~~라고 했어요.

그러면, 지금 둘다 

cell의 Identifier는 "cell"이에요. 

대리자 위임도 했고, cell의 Identifier도 지정해줬으니 실행이 잘 되겠죠? 

그러나..실행을 하면,

네..하지만..실행하면..Xcode는 "cell"이라는 Identifier가 없는데?; 너 지금 나랑 무ㅝ하는거야? 장난해?

라고 말해줍니다. 


아니..오ㅑ....둘다 Identifier..cell맞는데..

(진심 이 오류 때문에 몇번이나 확인함..)


그래서 잠깐 BottomTableView의 대리자 위임을 취소해봤습니다.

(BottomTableView.delegate = self, BottomTableView.dataSource = self삭제)


그러더니 갑자기 되더라구요..? 

그래서 Identifier문제가 아니고..그냥 뭔가 TableView가 2개이면 인식을 못하나봐요..


자..근데 우리는 테이블 뷰 하나만 쓸거 아니잖아요? 이걸 가능하게 어떻게하냐..

바로 register메소드를 이용하는 것입니다!!

register에 대한 자세한 내용은 tableView Delegate, Datasource tutorial를 참고해주세요 :)



4. viewDidLoad()에 Register메소드 호출


자, 이렇게 하고 실행시키면!

짠!! 실행이 잘 되게 됩니다. storyBoard에서는 안되는게 register로는 되는 현상 ㄷㄷ.....


일단 "하나의 뷰"에 있는 "다른 테이블뷰"에 같은 내용을 넣어봤어요. 

그럼 다른 내용을 넣어볼까요?



5. 각각의 테이블뷰에 다른 내용 넣어보기.


● 방법 1 -  tableView 이름으로 구분



dataSource의 함수인, cellForRowAt에서, 인자로 받는 tableView로 TableView의 이름을 확인 할 수 있어요. 

그럼 결과는?

짠!! 다르게 나왔죠? XD

numberOfRowsInSection메소드에서도 당연히 가능합니다.



이렇게 row개수를 구분해주면!

이러한 TableView를 볼 수 있게 됩니다.


● 방법 2 - tag로 구분


tag는 viewDidLoad()에서 줄 수 있어요!



바로 이렇게요! 그리고 dataSource의 메소드로 가서, 



이렇게 tag로 구분해 줄 수 있습니다! 그럼 결과는?!?!?

방법 1과 똑같이 나오게 되죠 ㅎㅎ


간단하죠? ㅎㅎ

오늘도 도움이 되었길 바라며~~😆








반응형