12/08/2018, 15:59

Passing data back using Protocol in swift ios

Xin chào các bạn. Mình là newbie ios thôi vừa mới vọc được cái send back data trong ios thấy hứng thú quá làm ngay 1 bài cho nó máu sau này cân dùng cũng có thể xem lại. Bài viết của mình sử dụng một số thư viện liên quan đến Reactive swift (Đang học nhưng mà ngu vãi ra mãi chưa thông). Các bạn ...

Xin chào các bạn. Mình là newbie ios thôi vừa mới vọc được cái send back data trong ios thấy hứng thú quá làm ngay 1 bài cho nó máu sau này cân dùng cũng có thể xem lại.

Bài viết của mình sử dụng một số thư viện liên quan đến Reactive swift (Đang học nhưng mà ngu vãi ra mãi chưa thông).

Các bạn sử dụng pod cocoa https://cocoapods.org/ để sử dụng thư viện bên ngoài cho ios nhé.

1. init pod

  pod init

2. import rxswift và rxcocoa

Các bạn mở file Podfile và thêm vào 2 dòng sau

target 'wundercast' do
  use_frameworks!
    pod 'RxSwift', '~> 3.0'
    pod 'RxCocoa', '~> 3.0'
end

update pod sử dụng: pod install

Ở 2 màn hình các bạn import cho mình 2 thư viện nhé

  import RxSwift
  import RxCocoa

3. Xoá main.storyboard và sử dụng code

Các bạn xoá 2 file

  - main.storyboard
  - ViewController

Các bạn vào trong này tìm dòng có chữ main thì xoá đi nhé

4. Code trong AppDelegate.swift

Trong hàm func application
    window = UIWindow(frame: UIScreen.main.bounds)
    # Khai báo main để ios trỏ vào
    let main = ScreenOneViewController(nibName: "ScreenOneViewController", bundle: nil)
    # Khai báo navigation để điều hướng trang tốt hơn
    let nav = UINavigationController(rootViewController: main)

    window?.rootViewController = nav
    # Hiển thị
    window?.makeKeyAndVisible()

5. Khai báo Protocol ở màn hình 2 (screen 2)

Khai báo một protocol Dưới dòng import các bạn khai báo cho mình

import UIKit
import RxCocoa
import RxSwift

protocol SendBackData {
    func sendDataToBack(value: String)
}

class ScreenTwoViewController: UIViewController {

    @IBOutlet weak var buttonBack: UIButton!
    
    # Khai báo 1 disposeBag => Quản lý bộ nhớ của thư viện Rx
    var disposeBag = DisposeBag()

    # Khai báo delegate. SendBackData chính là protocol của chúng ta
    var delegate: SendBackData?

    override func viewDidLoad() {
        super.viewDidLoad()
        # sự kiện click button sử dụng thử viện Rx bạn nhé.
        buttonBack.rx.tap
            .subscribe(onNext: { _ in
                # Tại đây mình gọi protocol truyền data mà mình muốn truyền vào đây
               self.delegate?.sendDataToBack(value: "Send data to back first screen")
               
               # pop screen2 ra khỏi navigation.
                self.navigationController?.popViewController(animated: true)
            }).disposed(by: disposeBag)
    }
}

6. Nhận dữ liệu ở màn hình 1 (screen 1)

import UIKit
import RxCocoa
import RxSwift
 
class ScreenOneViewController: UIViewController, SendBackData  {  # implement cái protocol ở màn hình 2 kia vào đây.
    let disposeBag = DisposeBag()

    @IBOutlet weak var ccLabel: UILabel!
    @IBOutlet weak var ccButton: UIButton!

    var valueSentFromSecondViewController:String?

    override func viewDidLoad() {
        super.viewDidLoad()

	# sự kiện click button giống screen 2
        self.ccButton.rx.tap 
            .subscribe(onNext: { data in
            	# khai báo Screen2 ở đây để gọi delegate
                let view2 = ScreenTwoViewController()
                view2.delegate = self
                self.navigationController?.pushViewController(view2, animated: true)
            }).disposed(by: disposeBag)
    }

# Chúng ta implement cái func protocol
    func sendDataToBack(value: String) {
    # set dâta vào biến tạm
        self.valueSentFromSecondViewController = value
    }

    override func viewDidAppear(_ animated: Bool) {
	# test
        if let a = valueSentFromSecondViewController {
            print(a)
        }
    }

7. Kết quả:

Output => Send data to back first screen

0