Passing data back using Protocol in swift ios
Bài đăng này đã không được cập nhật trong 3 năm
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
All rights reserved