সুইফট 5
ওয়েল ম্যাট প্রাইসের উত্তর ডেটা পাস করার জন্য পুরোপুরি ঠিক আছে তবে আমি এটি নতুন করে লিখতে চলেছি, সর্বশেষ সুইফ্ট সংস্করণে কারণ আমি বিশ্বাস করি যে নতুন প্রোগ্রামাররা এটি নতুন সিনট্যাক্স এবং পদ্ধতি / কাঠামোর কারণে চ্যালেঞ্জিং ছেড়ে দিয়েছে বলে মূল পোস্টটি উদ্দেশ্য সি-তে রয়েছে।
ভিউ কন্ট্রোলারের মধ্যে ডেটা পাস করার জন্য একাধিক বিকল্প রয়েছে।
- নেভিগেশন কন্ট্রোলার পুশ ব্যবহার করা
- Segue ব্যবহার
- প্রতিনিধি ব্যবহার
- বিজ্ঞপ্তি পর্যবেক্ষক ব্যবহার করে
- ব্লক ব্যবহার করা হচ্ছে
আমি সর্বশেষ আইওএস ফ্রেমওয়ার্ক সহ সুইফটে তার যুক্তিটি আবার লিখতে চলেছি
নেভিগেশন কন্ট্রোলার পুশ হয়ে ডেটা পাসিং : ভিউকন্ট্রোলারএ থেকে ভিউকন্ট্রোলারবিতে
পদক্ষেপ 1. ViewControllerB এ পরিবর্তনীয় ঘোষণা করুন Dec
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. নেভিগেশন কন্ট্রোলারের মাধ্যমে ধাক্কা দেওয়ার সময় ভিউকন্ট্রোলারএ পাস ডেটা
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)
}
}
সেগুর মাধ্যমে ডেটা পাসিং : ভিউকন্ট্রোলারএ থেকে ভিউকন্ট্রোলারবিতে
পদক্ষেপ 1. ভিউ কন্ট্রোলারএ থেকে ভিউকন্ট্রোলারবিতে সেগু তৈরি করুন এবং স্টোরিবোর্ডে আইডেন্টিফায়ার = শোডেটেলসইগু নিন
পদক্ষেপ ২. ভিউকন্ট্রোলারবিতে একটি সার্থক নামসোমথিংএনেবলড ঘোষণা করুন এবং এর মানটি মুদ্রণ করুন।
পদক্ষেপ ৩. ভিউকন্ট্রোলার পাসে সিগু উত্তীর্ণ হওয়ার সময়সামথিংএনেবলের মান
সুতরাং এখানে সম্পূর্ণ কোড এখানে:
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)
}
}
প্রতিনিধিটির মাধ্যমে ডেটা পাস করা : ভিউকন্ট্রোলারবি থেকে ভিউকন্ট্রোলারএ
পদক্ষেপ 1. প্রোটোকল ভিউ কন্ট্রোলার বি ডেলিগেট ঘোষণা ভিকন্ট্রোলারবি ফাইলে কিন্তু শ্রেণীর বাইরে
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. ভিউকন্ট্রোলারবি'র ভিডিডিলোড পদ্ধতিতে ডেলিগেটের জন্য ডেটা প্রেরণ করুন
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
পদক্ষেপ 4. ভিউকন্ট্রোলারএতে ViewControllerBDelegate নিশ্চিত করুন
class ViewControllerA: UIViewController, ViewControllerBDelegate {
// to do
}
পদক্ষেপ 5. নিশ্চিত করুন যে আপনি ভিউকন্ট্রোলারএতে প্রতিনিধি প্রয়োগ করবেন
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)
}
}
পদক্ষেপ View. ভিউকন্ট্রোলারএতে ডেটা পাওয়ার জন্য ডেলিগেট পদ্ধতিটি প্রয়োগ করুন
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")
}
}
বিজ্ঞপ্তি পর্যবেক্ষকের মাধ্যমে ডেটা পাস করা : ভিউকন্ট্রোলারবি থেকে ভিউকন্ট্রোলারএ
পদক্ষেপ 1. ভিউকন্ট্রোলারবিতে বিজ্ঞপ্তি পর্যবেক্ষকগুলিতে ডেটা সেট এবং পোস্ট করুন
let objToBeSent = "Test Message from Notification"
NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
পদক্ষেপ 2. ভিউকন্ট্রোলারএতে বিজ্ঞপ্তি পর্যবেক্ষক যুক্ত করুন
NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
পদক্ষেপ 3. ViewControllerA এ বিজ্ঞপ্তি ডেটা মান পান Re
@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)
}
}
ব্লক হয়ে ডেটা পাসিং : ভিউকন্ট্রোলারবি থেকে ভিউকন্ট্রোলারএ
পদক্ষেপ 1. ViewControllerB এ ব্লক ঘোষণা করুন
var অনুমোদন কমপ্লিটব্লক: ((বুল) -> ())? = {_ ইন}
পদক্ষেপ 2. ভিউকন্ট্রোলারবি ব্লকে ডেটা সেট করুন
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)
}
}
}
আপনি আমার গিটহাব এ সম্পূর্ণ নমুনা অ্যাপ্লিকেশনটি পেতে পারেন দয়া করে এ সম্পর্কে আপনার কোনও প্রশ্ন (গুলি) রয়েছে কিনা তা আমাকে জানান।
@class ViewControllerB;
@ প্রোটোকল সংজ্ঞা উপরে রাখতে হবে? তা ছাড়া আমার লাইনে ViewControllerB উপর একটি "প্রত্যাশিত টাইপ" ত্রুটি পাবেন:- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
মধ্যে@protocol
ঘোষণা