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