Swift 5
Vâng Matt Price trả lời là hoàn toàn tốt đẹp cho truyền dữ liệu nhưng tôi sẽ viết lại nó, trong Latest Swift phiên bản vì tôi tin rằng các lập trình viên mới thấy nó bỏ thách thức do Cú pháp mới và phương pháp / khuôn khổ, như bài gốc là trong Objective-C.
Có nhiều tùy chọn để truyền dữ liệu giữa các bộ điều khiển xem.
- Sử dụng Bộ điều khiển Điều hướng Đẩy
- Sử dụng phân đoạn
- Sử dụng đại biểu
- Sử dụng Trình quan sát thông báo
- Sử dụng khối
Tôi sẽ viết lại logic của anh ấy trong Swift với iOS Framework mới nhất
Truyền dữ liệu qua bộ điều khiển điều hướng Đẩy : Từ ViewControllA đến ViewContoderB
Bước 1. Khai báo biến trong ViewControllB
var isSomethingEnabled = false
Bước 2. In biến trong phương thức ViewDidLoad của ViewContoderB
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through segue, navigation push
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
Bước 3. Trong ViewControllA Truyền dữ liệu trong khi đẩy qua Bộ điều khiển điều hướng
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.isSomethingEnabled = true
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
Vì vậy, đây là mã hoàn chỉnh cho:
ViewControllA
import UIKit
class ViewControllerA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK:Passing Data through Navigation PushViewController
@IBAction func goToViewControllerB(_ sender: Any) {
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.isSomethingEnabled = true
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
}
}
ViewControllB
import UIKit
class ViewControllerB: UIViewController {
//MARK: - Variable for Passing Data through Navigation push
var isSomethingEnabled = false
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through navigation push
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
}
Truyền dữ liệu qua phân đoạn : Từ ViewControllA đến ViewContoderB
Bước 1. Tạo Segue từ ViewContoderA đến ViewContoderB và đưa ra Định danh = showDetailSegue trong Storyboard như hiển thị bên dưới
Bước 2. Trong ViewControllB Khai báo một tên khả thi có tên làS SomethingEnables và in giá trị của nó.
Bước 3. Trong ViewControllA, vượt qua giá trị isS SomethingEnables trong khi truyền Segue
Vì vậy, đây là mã hoàn chỉnh cho:
ViewControllA
import UIKit
class ViewControllerA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: - - Passing Data through Segue - -
@IBAction func goToViewControllerBUsingSegue(_ sender: Any) {
performSegue(withIdentifier: "showDetailSegue", sender: nil)
}
//Segue Delegate Method
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "showDetailSegue") {
let controller = segue.destination as? ViewControllerB
controller?.isSomethingEnabled = true//passing data
}
}
}
ViewControllB
import UIKit
class ViewControllerB: UIViewController {
var isSomethingEnabled = false
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through segue
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
}
Truyền dữ liệu qua Delegate : Từ ViewControllB đến ViewControllA
Bước 1. Khai báo giao thức ViewContoderBDelegate trong tệp ViewControllB nhưng bên ngoài lớp
protocol ViewControllerBDelegate: NSObjectProtocol {
// Classes that adopt this protocol MUST define
// this method -- and hopefully do something in
// that definition.
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?)
}
Bước 2. Khai báo thể hiện biến đại biểu trong ViewContoderB
var delegate: ViewControllerBDelegate?
Bước 3. Gửi dữ liệu cho đại biểu bên trong phương thức viewDidLoad của ViewContoderB
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
Bước 4. Xác nhận ViewControllBDelegate trong ViewControllA
class ViewControllerA: UIViewController, ViewControllerBDelegate {
// to do
}
Bước 5. Xác nhận rằng bạn sẽ triển khai ủy nhiệm trong ViewControllA
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.delegate = self//confirming delegate
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
Bước 6. Thực hiện phương thức ủy nhiệm để nhận dữ liệu trong ViewControllA
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
print("Value from ViewControllerB's Delegate", item!)
}
Vì vậy, đây là mã hoàn chỉnh cho:
ViewControllA
import UIKit
class ViewControllerA: UIViewController, ViewControllerBDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
//Delegate method
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
print("Value from ViewControllerB's Delegate", item!)
}
@IBAction func goToViewControllerForDelegate(_ sender: Any) {
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.delegate = self
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
}
}
ViewControllB
import UIKit
//Protocol decleare
protocol ViewControllerBDelegate: NSObjectProtocol {
// Classes that adopt this protocol MUST define
// this method -- and hopefully do something in
// that definition.
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?)
}
class ViewControllerB: UIViewController {
var delegate: ViewControllerBDelegate?
override func viewDidLoad() {
super.viewDidLoad()
//MARK: - - - - Set Data for Passing Data through Delegate - - - - - -
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
}
}
Truyền dữ liệu qua Trình quan sát thông báo : Từ ViewControllB đến ViewControllA
Bước 1. Đặt và Đăng dữ liệu trong Trình quan sát thông báo trong ViewContoderB
let objToBeSent = "Test Message from Notification"
NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
Bước 2. Thêm Trình quan sát thông báo trong ViewControllA
NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
Bước 3. Nhận giá trị dữ liệu Thông báo trong ViewControllA
@objc func methodOfReceivedNotification(notification: Notification) {
print("Value of notification : ", notification.object ?? "")
}
Vì vậy, đây là mã hoàn chỉnh cho:
ViewControllA
import UIKit
class ViewControllerA: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
// add observer in controller(s) where you want to receive data
NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
}
//MARK: Method for receiving Data through Post Notification
@objc func methodOfReceivedNotification(notification: Notification) {
print("Value of notification : ", notification.object ?? "")
}
}
ViewControllB
import UIKit
class ViewControllerB: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//MARK:Set data for Passing Data through Post Notification
let objToBeSent = "Test Message from Notification"
NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
}
}
Truyền dữ liệu qua khối : Từ ViewControllB đến ViewContoderA
Bước 1. Khai báo khối trong ViewControllB
var ủy quyềnCompletionBlock: ((Bool) -> ())? = {_ in}
Bước 2. Đặt dữ liệu trong khối trong ViewControllB
if authorizationCompletionBlock != nil
{
authorizationCompletionBlock!(true)
}
Bước 3. Nhận dữ liệu khối trong ViewControllA
//Receiver Block
controller!.authorizationCompletionBlock = { isGranted in
print("Data received from Block is :", isGranted)
}
Vì vậy, đây là mã hoàn chỉnh cho:
ViewControllA
import UIKit
class ViewControllerA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK:Method for receiving Data through Block
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "showDetailSegue") {
let controller = segue.destination as? ViewControllerB
controller?.isSomethingEnabled = true
//Receiver Block
controller!.authorizationCompletionBlock = { isGranted in
print("Data received from Block is :", isGranted)
}
}
}
}
ViewControllB
import UIKit
class ViewControllerB: UIViewController {
//MARK:Variable for Passing Data through Block
var authorizationCompletionBlock:((Bool)->())? = {_ in}
override func viewDidLoad() {
super.viewDidLoad()
//MARK:Set data for Passing Data through Block
if authorizationCompletionBlock != nil
{
authorizationCompletionBlock!(true)
}
}
}
Bạn có thể tìm thấy Ứng dụng mẫu hoàn chỉnh tại GitHub của tôi Vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi nào về vấn đề này.
@class ViewControllerB;
định nghĩa trên @protatio? Nếu không có nó, tôi gặp lỗi "Loại dự kiến" trên ViewContoderB trong dòng:- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
trong phần@protocol
khai báo