ViewController 전환 시 값 전달 (feat. NavigationController)


protocol을 활용하여 delegate 위임 후 메서드 콜을 하는 방식으로 구현한다.




protocol.swift


1
2
3
4
5
6
// 자식 -> 부모 컨트롤러 선택 후 데이터 전달
protocol ChildViewDataResponseDelegate
{
    // 자식의 선택값 전달
    func ChildSelectDataResponse (favoriteItem : FavoriteItemDto)
}
cs


리턴시킬 규약을 정한다.




받는ViewController.swift


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ViewController_ShoppingList: ViewController_Base, ChildViewDataResponseDelegate {
 
    // MARK: ChildViewDataReceiveProtocol
    func ChildSelectDataResponse(favoriteItem: FavoriteItemDto)
    {
        NSLog("===== ViewController_ShoppingList ChildSelectDataResponse name : %@", favoriteItem.itemName);
    }
 
    // 쇼핑리스트 아이템 추가
    @objc func startAlert_itemAdd ()
    {
        // pushViewController
        let storyboard = UIStoryboard(name: "Main", bundle: nil);
        let viewController_ShoppingListAdd = storyboard.instantiateViewController(withIdentifier: "ViewController_ShoppingListAdd"as! ViewController_ShoppingListAdd;
        viewController_ShoppingListAdd.delegate = self
        self.navigationController?.pushViewController(viewController_ShoppingListAdd, animated: true);
    }
}
cs


받는 쪽에서 Protocol 규약을 명시한다.


그리고 전달받은 ViewController 호출 전 delegate를 자식쪽에 선언 후 부모의 delegate를 물려준다. (15번 라인)




전달할 ViewController.swift


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class ViewController_ShoppingListAdd: ViewController_Base {
 
    // ReturnProtocol
    var selectedItem: FavoriteItemDto?
    var delegate: ChildViewDataResponseDelegate?
}
 
// MARK: - Extension (Navigation)
 
extension ViewController_ShoppingListAdd : UITableViewDelegate {
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension;
    }
    
    // 셀 선택
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        NSLog("===== ViewController_ShoppingListAdd UITableViewDelegate didSelectRowAt row : %d", indexPath.row);
        
        // protocol을 사용하여 값 전달
        delegate?.ChildSelectDataResponse(favoriteItem: array_itemList[indexPath.row])
        
        self.navigationController?.popViewController(animated: true)
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
    }
}
cs


값을 전달하는 쪽에서는 부모에게 전달할 Dto와 protocol을 인스턴스로 생성 후,


protocol을 통해 메소드를 호출하여 값을 전달하도록 한다.

이 글을 공유하기


댓글(0)

Designed by CMSFactory.NET