स्विफ्ट 5
खैर मैट प्राइस का जवाब डेटा पास करने के लिए पूरी तरह से ठीक है, लेकिन मैं इसे फिर से लिखने जा रहा हूं, नवीनतम स्विफ्ट संस्करण में क्योंकि मेरा मानना है कि नए प्रोग्रामर नए सिंटैक्स और विधियों / रूपरेखाओं के कारण इसे चुनौतीपूर्ण छोड़ते हैं, क्योंकि मूल पोस्ट ऑब्जेक्टिव-सी में है।
व्यू कंट्रोलर्स के बीच डेटा पास करने के कई विकल्प हैं।
- नेविगेशन नियंत्रक पुश का उपयोग करना
- सेग का उपयोग करना
- डेलिगेट का उपयोग करना
- अधिसूचना पर्यवेक्षक का उपयोग करना
- ब्लॉक का उपयोग करना
मैं स्विफ्ट में नवीनतम iOS फ्रेमवर्क के साथ अपने तर्क को फिर से लिखने जा रहा हूं
नेविगेशन कंट्रोलर पुश के माध्यम से डेटा पास करना : 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 पास डेटा
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. ViewControllerA से ViewControllerB से बहस बनाएँ और स्टोरीबोर्ड में Identifier = showDetailSegue दें जैसा कि नीचे दिखाया गया है
चरण 2। ViewControllerB में एक समांतर नाम घोषित किया गया है जिसका नाम आइसोमेलेबल है और इसके मूल्य को प्रिंट करें।
चरण 3. ViewControllerA में पास से गुजरते समय isSomethingEnabled के मान
तो यहाँ के लिए पूरा कोड है:
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. प्रोटोकॉल देखें 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. ViewControllerB के viewDidLoad विधि के अंदर प्रतिनिधि के लिए डेटा भेजें
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
चरण 4. ViewControllerA में ViewControllerBDelegate की पुष्टि करें
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 प्राधिकरणकंप्लीमेंटेशनब्लॉक: ((बूल) -> ())? = {_ in}
चरण 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