একজন কীভাবে একজন প্রতিনিধি তৈরির বিষয়ে অর্থাত্ NSUserNotificationCenterDelegate
ত্বরান্বিত হয়?
একজন কীভাবে একজন প্রতিনিধি তৈরির বিষয়ে অর্থাত্ NSUserNotificationCenterDelegate
ত্বরান্বিত হয়?
উত্তর:
এটি আপত্তি-সি থেকে আলাদা নয়। প্রথমত, আপনাকে নিম্নলিখিত শ্রেণীর ঘোষণায় আপনার প্রোটোকলটি নির্দিষ্ট করতে হবে:
class MyClass: NSUserNotificationCenterDelegate
বাস্তবায়ন নীচের মত দেখতে হবে:
// NSUserNotificationCenterDelegate implementation
func userNotificationCenter(center: NSUserNotificationCenter, didDeliverNotification notification: NSUserNotification) {
//implementation
}
func userNotificationCenter(center: NSUserNotificationCenter, didActivateNotification notification: NSUserNotification) {
//implementation
}
func userNotificationCenter(center: NSUserNotificationCenter, shouldPresentNotification notification: NSUserNotification) -> Bool {
//implementation
return true
}
অবশ্যই, আপনি প্রতিনিধি সেট করতে হবে। উদাহরণ স্বরূপ:
NSUserNotificationCenter.defaultUserNotificationCenter().delegate = self;
@interface MyCustomClass: UIViewController <ClassIWantToUseDelegate>
সিতে, আপনার কাছে এই মিথ্যাটি কিছু থাকতে পারে , যা আপনাকে ভিউকন্ট্রোলারের সূচনা / কনফিগার করতে, পাশাপাশি সাবউভিউগুলিতে ডেলিগেট পদ্ধতিগুলি কল করতে দেয়? কিছু অনুরূপ এই ?
দু'জন ভিউ কন্ট্রোলারের মধ্যে প্রতিনিধিদের সম্পর্কে এখানে একটু সহায়তা দেওয়া হয়েছে:
পদক্ষেপ 1: ইউআইভিউউকন্ট্রোলারে এমন একটি প্রোটোকল তৈরি করুন যা আপনি মুছে ফেলবেন / ডেটা প্রেরণ করবেন।
protocol FooTwoViewControllerDelegate:class {
func myVCDidFinish(_ controller: FooTwoViewController, text: String)
}
Step2: পাঠানোর ক্লাসে প্রতিনিধি ঘোষণা (অর্থাত UIViewcontroller)
class FooTwoViewController: UIViewController {
weak var delegate: FooTwoViewControllerDelegate?
[snip...]
}
স্টিপি 3: প্রাপ্তি পদ্ধতিতে ডেটা প্রেরণ করতে একটি শ্রেণি পদ্ধতিতে প্রতিনিধি ব্যবহার করুন, যা প্রোটোকল গ্রহণ করে এমন কোনও পদ্ধতি।
@IBAction func saveColor(_ sender: UIBarButtonItem) {
delegate?.myVCDidFinish(self, text: colorLabel.text) //assuming the delegate is assigned otherwise error
}
পদক্ষেপ 4: গ্রাহক শ্রেণিতে প্রোটোকল গ্রহণ করুন
class ViewController: UIViewController, FooTwoViewControllerDelegate {
পদক্ষেপ 5: প্রতিনিধি পদ্ধতিটি কার্যকর করুন
func myVCDidFinish(_ controller: FooTwoViewController, text: String) {
colorLabel.text = "The Color is " + text
controller.navigationController.popViewController(animated: true)
}
পদক্ষেপ:: প্রস্তুতির জন্য প্রতিনিধি নির্ধারণ করুনসেগ:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "mySegue" {
let vc = segue.destination as! FooTwoViewController
vc.colorString = colorLabel.text
vc.delegate = self
}
}
এবং এটি কাজ করা উচিত। এটি অবশ্যই কেবল কোড টুকরা, তবে আপনাকে ধারণা দেওয়া উচিত। এই কোডটির দীর্ঘ ব্যাখ্যার জন্য আপনি আমার ব্লগ এন্ট্রিতে এখানে যেতে পারেন:
আপনি যদি কোনও প্রতিনিধিটির সাথে হুডের নীচে কী চলছে সে বিষয়ে আগ্রহী হন তবে আমি এখানে এটি লিখেছিলাম:
weak
স্ট্রাক্ট এবং এনামগুলি নয় কেবল ক্লাসগুলির জন্য প্রয়োজনীয়। যদি প্রতিনিধি কোনও স্ট্রাক্ট বা এনাম হতে চলেছে তবে আপনার ধরে রাখার চক্র সম্পর্কে চিন্তা করার দরকার নেই। যাইহোক, এটির একটি শ্রেণীর প্রতিনিধি দিন (এটি বেশিরভাগ ক্ষেত্রে এর একটি ভিউকন্ট্রোলার হওয়ার কারণে এটি বেশিরভাগ ক্ষেত্রে সত্য) তবে আপনার প্রয়োজন weak
তবে আপনার প্রোটোকলকে শ্রেণি হিসাবে ঘোষণা করা দরকার। এখানে আরও তথ্য রয়েছে স্ট্যাকওভারফ্লো.com
প্রতিনিধিরা সর্বদা আমাকে বিভ্রান্ত করেন যতক্ষণ না আমি বুঝতে পারি যে একটি প্রতিনিধি মাত্র একটি শ্রেণি যা অন্য শ্রেণীর জন্য কিছু কাজ করে । এটি অন্য কারও কাছে থাকার মতো যা আপনার জন্য সমস্ত নোংরা কাজ করে যা আপনি নিজেরাই করতে চান না।
আমি এটি বর্ণনা করার জন্য একটি ছোট গল্প লিখেছি। আপনার পছন্দ হলে এটি কোনও খেলার মাঠে পড়ুন।
// MARK: Background to the story
// A protocol is like a list of rules that need to be followed.
protocol OlderSiblingDelegate: class {
// The following command (ie, method) must be obeyed by any
// underling (ie, delegate) of the older sibling.
func getYourNiceOlderSiblingAGlassOfWater()
}
// MARK: Characters in the story
class BossyBigBrother {
// I can make whichever little sibling is around at
// the time be my delegate (ie, slave)
weak var delegate: OlderSiblingDelegate?
func tellSomebodyToGetMeSomeWater() {
// The delegate is optional because even though
// I'm thirsty, there might not be anyone nearby
// that I can boss around.
delegate?.getYourNiceOlderSiblingAGlassOfWater()
}
}
// Poor little sisters have to follow (or at least acknowledge)
// their older sibling's rules (ie, protocol)
class PoorLittleSister: OlderSiblingDelegate {
func getYourNiceOlderSiblingAGlassOfWater() {
// Little sis follows the letter of the law (ie, protocol),
// but no one said exactly how she had to respond.
print("Go get it yourself!")
}
}
// MARK: The Story
// Big bro is laying on the couch watching basketball on TV.
let bigBro = BossyBigBrother()
// He has a little sister named Sally.
let sally = PoorLittleSister()
// Sally walks into the room. How convenient! Now big bro
// has someone there to boss around.
bigBro.delegate = sally
// So he tells her to get him some water.
bigBro.tellSomebodyToGetMeSomeWater()
// Unfortunately no one lived happily ever after...
// The end.
পর্যালোচনাতে, প্রতিনিধি নিদর্শন তৈরি এবং ব্যবহারের জন্য তিনটি মূল অংশ রয়েছে।
উপরের আমাদের বোসি বিগ ব্রাদার গল্পের তুলনায় প্রতিনিধিরা প্রায়শই নিম্নলিখিত ব্যবহারিক প্রয়োগগুলির জন্য ব্যবহৃত হয়:
দারুণ অংশটি হ'ল এই ক্লাসগুলির আগে থেকেই একে অপরের সম্পর্কে কিছু জানার দরকার নেই, তবে ডেলিগেট ক্লাস প্রয়োজনীয় প্রোটোকলের সাথে সম্মত হয়।
আমি নিম্নলিখিত দুটি নিবন্ধ পড়ার অত্যন্ত পরামর্শ দিচ্ছি। তারা আমাকে ডকুমেন্টেশনগুলির চেয়ে আরও ভালভাবে প্রতিনিধিদের বুঝতে সাহায্য করেছিল ।
আরও একটি নোট
রেফারেন্স দেয় যে অন্যান্য শ্রেণিগুলির মালিকানা তাদের নেই, weak
শক্তিশালী রেফারেন্স চক্র এড়াতে কীওয়ার্ডটি ব্যবহার করা উচিত । আরও তথ্যের জন্য এই উত্তর দেখুন ।
আমি @ মেক অ্যাপপি পোস্ট করার জন্য কিছু সংশোধন পেয়েছি
প্রথমে আপনি যখন ডেলিগেট প্রোটোকল তৈরি করছেন তখন এটি ক্লাস প্রোটোকলের সাথে সঙ্গতিপূর্ণ হওয়া উচিত। নীচের উদাহরণে পছন্দ করুন।
protocol ProtocolDelegate: class {
func myMethod(controller:ViewController, text:String)
}
দ্বিতীয়ত, ধরে রাখার চক্র এড়াতে আপনার প্রতিনিধি দুর্বল হওয়া উচিত।
class ViewController: UIViewController {
weak var delegate: ProtocolDelegate?
}
শেষ, আপনি সুরক্ষিত কারণ আপনার প্রোটোকলটি একটি alচ্ছিক মান। তার মানে এর "নিল" বার্তাটি এই সম্পত্তিটিতে প্রেরণ করা হবে না। এটি respondToselector
অবজেক্টে শর্তযুক্ত বক্তব্যের অনুরূপ তবে এখানে আপনার কাছে সমস্ত কিছু এক লাইনে রয়েছে:
if ([self.delegate respondsToSelector:@selector(myMethod:text:)]) {
[self.delegate myMethod:self text:@"you Text"];
}
উপরে আপনার একটি আপত্তি-সি উদাহরণ রয়েছে এবং নীচে আপনার দেখতে এটির স্যুইফ্ট উদাহরণ রয়েছে।
delegate?.myMethod(self, text:"your Text")
delegate?.myMethod
ক্রাশ হবে না কারণ যদি প্রতিনিধি হয় nil
তবে কিছুই হবে না। তবে আপনি যদি ভুল করেছেন এবং লিখেছেন যে কোনও প্রতিনিধি সেট না করা থাকলে delegate!.myMethod
আপনি ক্র্যাশ করতে পারেন, সুতরাং এটি আপনার সুরক্ষার জন্য মূলত একটি উপায় ...
এখানে আমি একটি সংক্ষেপ লিখেছি। আমি একই ভাবছিলাম এবং এটি আমার বোঝার উন্নতি করতে সহায়তা করেছিল। কী চলছে তা দেখার জন্য এটি একটি এক্সকোড প্লেগ্রাউন্ডে খুলুন ।
protocol YelpRequestDelegate {
func getYelpData() -> AnyObject
func processYelpData(data: NSData) -> NSData
}
class YelpAPI {
var delegate: YelpRequestDelegate?
func getData() {
println("data being retrieved...")
let data: AnyObject? = delegate?.getYelpData()
}
func processYelpData(data: NSData) {
println("data being processed...")
let data = delegate?.processYelpData(data)
}
}
class Controller: YelpRequestDelegate {
init() {
var yelpAPI = YelpAPI()
yelpAPI.delegate = self
yelpAPI.getData()
}
func getYelpData() -> AnyObject {
println("getYelpData called")
return NSData()
}
func processYelpData(data: NSData) -> NSData {
println("processYelpData called")
return NSData()
}
}
var controller = Controller()
UIViewController
ক্লাসকে আমাদের তৈরি প্রতিনিধি অনুসারে তৈরি করতে পারি? সেগুলি কি একটি সুইফ্ট ফাইলে ঘোষণা করতে হবে? যে কোনও সাহায্যের অর্থ অনেক বেশি।
class ViewController : UIViewController NameOfDelegate
।
a.swift
উপরে আপনার উত্তর অনুসারে একটি প্রতিনিধি শ্রেণি তৈরি করি তখন তা আসে না b.swift
। আমি আমার সুইফট ফাইলের বাইরে কোনও ক্লাসে পৌঁছতে পারি না। কোন কড়া?
সুইফট 2 ডিফল্ট
আমি দুটি ভিউ নিয়ন্ত্রণকারীদের সাথে ডেলিগেটের উদাহরণ দিয়ে ব্যাখ্যা করছি this এই ক্ষেত্রে, সেকেন্ডভিসি অবজেক্টটি প্রথম ভিউ কন্ট্রোলারে ডেটা প্রেরণ করছে।
প্রোটোকল ঘোষণা সহ ক্লাস
protocol getDataDelegate {
func getDataFromAnotherVC(temp: String)
}
import UIKit
class SecondVC: UIViewController {
var delegateCustom : getDataDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func backToMainVC(sender: AnyObject) {
//calling method defined in first View Controller with Object
self.delegateCustom?.getDataFromAnotherVC("I am sending data from second controller to first view controller.Its my first delegate example. I am done with custom delegates.")
self.navigationController?.popViewControllerAnimated(true)
}
}
প্রথম ভিউ কন্ট্রোলার প্রোটোকল অনুসারে এখানে সম্পন্ন করা হয়:
class ViewController: UIViewController, getDataDelegate
ফার্স্ট ভিউ কন্ট্রোলারে প্রোটোকল পদ্ধতির সংজ্ঞা (ViewController)
func getDataFromAnotherVC(temp : String)
{
// dataString from SecondVC
lblForData.text = dataString
}
ফার্স্ট ভিউ কন্ট্রোলার (ভিউকন্ট্রোলার) থেকে সেকেন্ডভিসিকে চাপ দেওয়ার সময়
let objectPush = SecondVC()
objectPush.delegateCustom = self
self.navigationController.pushViewController(objectPush, animated: true)
প্রথম শ্রেণি:
protocol NetworkServiceDelegate: class {
func didCompleteRequest(result: String)
}
class NetworkService: NSObject {
weak var delegate: NetworkServiceDelegate?
func fetchDataFromURL(url : String) {
delegate?.didCompleteRequest(url)
}
}
দ্বিতীয় শ্রেণী:
class ViewController: UIViewController, NetworkServiceDelegate {
let network = NetworkService()
override func viewDidLoad() {
super.viewDidLoad()
network.delegate = self
network.fetchDataFromURL("Success!")
}
func didCompleteRequest(result: String) {
print(result)
}
}
Type 'ViewController' does not conform to protocol 'NetworkServiceDelegate'
plz প্রস্তাব দেখায় । এটি আমার দ্রুতগতিতে 6th ষ্ঠ দিন :)
ধাপে ধাপে খুব সহজ পদক্ষেপ (100% কাজ এবং পরীক্ষিত)
পদক্ষেপ 1: প্রথম দেখা নিয়ন্ত্রকের উপর পদ্ধতি তৈরি করুন
func updateProcessStatus(isCompleted : Bool){
if isCompleted{
self.labelStatus.text = "Process is completed"
}else{
self.labelStatus.text = "Process is in progress"
}
}
পদক্ষেপ 2: দ্বিতীয় দর্শন নিয়ামককে চাপ দেওয়ার সময় প্রতিনিধি সেট করুন
@IBAction func buttonAction(_ sender: Any) {
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as! secondViewController
secondViewController.delegate = self
self.navigationController?.pushViewController(secondViewController, animated: true)
}
স্টিপি 3: প্রতিনিধি পছন্দ করুন like
শ্রেণি ভিউ কন্ট্রোলার : ইউআইভিউকন্ট্রোলার , প্রসেসস্ট্যাটাসডেলিগেট {
পদক্ষেপ 4: প্রোটোকল তৈরি করুন
protocol ProcessStatusDelegate:NSObjectProtocol{
func updateProcessStatus(isCompleted : Bool)
}
পদক্ষেপ 5: একটি পরিবর্তনশীল নিন
var delegate:ProcessStatusDelegate?
পদক্ষেপ:: পূর্ববর্তী ভিউ কন্ট্রোলার কল ডেলিগেট পদ্ধতিতে ফিরে যাওয়ার সময়ে ডেটা দিয়ে প্রথমে কন্ট্রোলারকে জানান
@IBAction func buttonActionBack(_ sender: Any) {
delegate?.updateProcessStatus(isCompleted: true)
self.navigationController?.popViewController(animated: true)
}
@IBAction func buttonProgress(_ sender: Any) {
delegate?.updateProcessStatus(isCompleted: false)
self.navigationController?.popViewController(animated: true)
}
সাধারণ উদাহরণ:
protocol Work: class {
func doSomething()
}
class Manager {
weak var delegate: Work?
func passAlong() {
delegate?.doSomething()
}
}
class Employee: Work {
func doSomething() {
print("Working on it")
}
}
let manager = Manager()
let developer = Employee()
manager.delegate = developer
manager.passAlong() // PRINTS: Working on it
প্রতিনিধিরা হ'ল একটি নকশার প্যাটার্ন যা কোনও নির্দিষ্ট ইভেন্ট ঘটলে একটি বস্তুকে অন্য কোনও বস্তুতে বার্তা প্রেরণ করতে দেয়। কোনও বস্তুটি কল্পনা করুন একটি ক্রিয়া সম্পাদনের জন্য একটি বস্তু বি কল করে। ক্রিয়াটি সম্পূর্ণ হয়ে গেলে, এ-এর অবজেক্টটি জানতে হবে যে বি কাজটি সম্পন্ন করেছে এবং প্রয়োজনীয় পদক্ষেপ নিয়েছে, প্রতিনিধিদের সহায়তায় এটি অর্জন করা যেতে পারে! এখানে একটি টিউটোরিয়াল বাস্তবায়ন প্রতিনিধিরা ধাপে ধাপে 3 3
উপরের সমাধানগুলি কিছুটা দম্পতিযুক্ত মনে হয়েছিল এবং একই সাথে অন্যান্য নিয়ন্ত্রকদের একই প্রোটোকলটিকে পুনরায় ব্যবহার করা এড়াতে হবে, এজন্যই আমি জেনেরিক টাইপ-ইরেজর ব্যবহার করে আরও শক্তিশালী টাইপযুক্ত সমাধানটি নিয়ে এসেছি।
@noreturn public func notImplemented(){
fatalError("not implemented yet")
}
public protocol DataChangedProtocol: class{
typealias DataType
func onChange(t:DataType)
}
class AbstractDataChangedWrapper<DataType> : DataChangedProtocol{
func onChange(t: DataType) {
notImplemented()
}
}
class AnyDataChangedWrapper<T: DataChangedProtocol> : AbstractDataChangedWrapper<T.DataType>{
var base: T
init(_ base: T ){
self.base = base
}
override func onChange(t: T.DataType) {
base.onChange(t)
}
}
class AnyDataChangedProtocol<DataType> : DataChangedProtocol{
var base: AbstractDataChangedWrapper<DataType>
init<S: DataChangedProtocol where S.DataType == DataType>(_ s: S){
self.base = AnyDataChangedWrapper(s)
}
func onChange(t: DataType) {
base.onChange(t)
}
}
class Source : DataChangedProtocol {
func onChange(data: String) {
print( "got new value \(data)" )
}
}
class Target {
var delegate: AnyDataChangedProtocol<String>?
func reportChange(data:String ){
delegate?.onChange(data)
}
}
var source = Source()
var target = Target()
target.delegate = AnyDataChangedProtocol(source)
target.reportChange("newValue")
আউটপুট : নতুন মান পেল নতুন ভ্যালু
ক্লাসে এমন একটি প্রতিনিধি তৈরি করুন যাতে অন্যান্য ক্লাসে কিছু ডেটা প্রেরণের বা কিছু কার্যকারিতা সরবরাহ করতে হবে
মত
protocol GetGameStatus {
var score: score { get }
func getPlayerDetails()
}
ক্লাসে যে এই প্রতিনিধি নিশ্চিত করতে যাচ্ছি
class SnakesAndLadders: GetGameStatus {
func getPlayerDetails() {
}
}