สวิฟท์ 5
ดีคำตอบแมตต์ไพรซ์เป็นอย่างดีดีสำหรับการส่งผ่านข้อมูล แต่ฉันจะเขียนมันในรุ่นสวิฟท์ล่าสุดเพราะผมเชื่อว่าเขียนโปรแกรมใหม่พบว่ามันออกจากความท้าทายเนื่องจากไวยากรณ์ใหม่และวิธีการ / กรอบเช่นโพสต์ต้นฉบับอยู่ใน Objective-C
มีหลายตัวเลือกสำหรับการส่งผ่านข้อมูลระหว่างตัวควบคุมมุมมอง
- การใช้ตัวควบคุมทิศทาง
- ใช้ Segue
- ใช้ตัวแทน
- ใช้สังเกตการณ์การแจ้งเตือน
- ใช้บล็อก
ฉันจะเขียนตรรกะของเขาใหม่ใน Swift ด้วย iOS Framework ล่าสุด
การส่งข้อมูลผ่านตัวควบคุมการนำทางพุช : จาก ViewControllerA ไปยัง ViewControllerB
ขั้นตอนที่ 1ประกาศตัวแปรใน ViewControllerB
var isSomethingEnabled = false
ขั้นตอนที่ 2พิมพ์ตัวแปรในเมธอด ViewControllerB 'ViewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through segue, navigation push
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
ขั้นตอนที่ 3ใน ViewControllerA Pass Data ในขณะที่กดผ่าน Navigation Controller
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)
}
}
ดังนั้นนี่คือรหัสที่สมบูรณ์สำหรับ:
ViewControllerA
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)
}
}
}
}
ViewControllerB
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)
}
}
การส่งผ่านข้อมูลผ่านเซกเมนต์ : จาก ViewControllerA ไปยัง ViewControllerB
ขั้นตอนที่ 1สร้าง Segue จาก ViewControllerA ไปยัง ViewControllerB และให้ Identifier = showDetailSegue ใน Storyboard ดังที่แสดงด้านล่าง
ขั้นตอนที่ 2ใน ViewControllerB ประกาศชื่อisSomethingEnabled ที่ทำงานได้และพิมพ์ค่า
ขั้นตอนที่ 3ในการส่งผ่าน ViewControllerA คือค่าของ SomethingEnabled ขณะผ่าน Segue
ดังนั้นนี่คือรหัสที่สมบูรณ์สำหรับ:
ViewControllerA
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
}
}
}
ViewControllerB
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)
}
}
การส่งผ่านข้อมูลผ่านผู้แทน : จาก ViewControllerB ไปยัง ViewControllerA
ขั้นตอนที่ 1ประกาศ Protocol ViewControllerBDelegateในไฟล์ ViewControllerB แต่อยู่นอกคลาส
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?)
}
ขั้นตอนที่ 2ประกาศผู้แทนอินสแตนซ์ตัวแปรใน ViewControllerB
var delegate: ViewControllerBDelegate?
ขั้นตอนที่ 3ส่งข้อมูลสำหรับผู้ได้รับมอบหมายภายในวิธีการ viewDidLoad ของ ViewControllerB
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
ขั้นตอน 4.ยืนยัน ViewControllerBDelegate ใน ViewControllerA
class ViewControllerA: UIViewController, ViewControllerBDelegate {
// to do
}
ขั้นตอนที่ 5ยืนยันว่าคุณจะใช้ผู้รับมอบสิทธิ์ใน ViewControllerA
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)
}
}
ขั้นตอนที่ 6ใช้วิธีการมอบหมายสำหรับการรับข้อมูลใน ViewControllerA
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
print("Value from ViewControllerB's Delegate", item!)
}
ดังนั้นนี่คือรหัสที่สมบูรณ์สำหรับ:
ViewControllerA
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)
}
}
}
}
ViewControllerB
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")
}
}
การส่งผ่านข้อมูลผ่านตัวสังเกตการแจ้งเตือน : จาก ViewControllerB ไปยัง ViewControllerA
ขั้นตอนที่ 1. ตั้งค่าและโพสต์ข้อมูลในผู้สังเกตการณ์การแจ้งเตือนใน ViewControllerB
let objToBeSent = "Test Message from Notification"
NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
ขั้นตอนที่ 2 เพิ่มผู้สังเกตการณ์การแจ้งเตือนใน ViewControllerA
NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
ขั้นตอนที่ 3 รับค่าข้อมูลการแจ้งเตือนใน ViewControllerA
@objc func methodOfReceivedNotification(notification: Notification) {
print("Value of notification : ", notification.object ?? "")
}
ดังนั้นนี่คือรหัสที่สมบูรณ์สำหรับ:
ViewControllerA
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 ?? "")
}
}
ViewControllerB
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)
}
}
การส่งผ่านข้อมูลผ่านบล็อก : จาก ViewControllerB ไปยัง ViewControllerA
ขั้นตอนที่ 1 ประกาศบล็อกใน ViewControllerB
var permissionCompletionBlock: ((Bool) -> ())? = {_ ใน}
ขั้นตอนที่ 2 ตั้งค่าข้อมูลในบล็อกใน ViewControllerB
if authorizationCompletionBlock != nil
{
authorizationCompletionBlock!(true)
}
ขั้นตอนที่ 3 รับข้อมูลบล็อกใน ViewControllerA
//Receiver Block
controller!.authorizationCompletionBlock = { isGranted in
print("Data received from Block is :", isGranted)
}
ดังนั้นนี่คือรหัสที่สมบูรณ์สำหรับ:
ViewControllerA
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)
}
}
}
}
ViewControllerB
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)
}
}
}
คุณสามารถค้นหาแอปพลิเคชันตัวอย่างแบบสมบูรณ์ได้ที่ GitHub ของฉันโปรดแจ้งให้เราทราบหากคุณมีคำถามใด ๆ เกี่ยวกับเรื่องนี้
@class ViewControllerB;
นิยาม @protocol ด้านบนด้วยหรือไม่ โดยไม่ได้ฉันได้รับข้อผิดพลาด "ประเภทที่คาดหวัง" ใน ViewControllerB ในบรรทัด:- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
ภายใน@protocol
ประกาศ