ডেলিগেশন কী এবং আইওএস প্রোগ্রামিংয়ে এটি গুরুত্বপূর্ণ কেন?


11

এই মুহুর্তে আমি নিজেকে আইওএস প্রোগ্রামিং শিখিয়ে দিচ্ছি, এবং একটি ধারণা যে আমার মাথা ঘিরে রাখা সত্যিই কঠিন মনে হচ্ছে তা হ'ল প্রতিনিধি দল। এটা কি? কেন এবং কিভাবে এটি ব্যবহার করা হয়? সুবিধা কী? আমি যে বইটি পড়ছি তা থেকে প্রযুক্তিগত লেখা বোঝা শক্ত করে তোলে।


4
আপনি স্ট্যাক ওভারফ্লোতে লক্ষ্য সি + প্রতিনিধি ট্যাগ ছেদটি দরকারী খুঁজে পেতে পারেন।

উত্তর:


16

বুঝতে delegatesহলে বুঝতে হবে protocols

protocolএকটি পরিষেবার চুক্তির মতো। যখন কোনও বস্তু (প্রায়শই একটি UIViewControllerসাবক্লাস, তবে সর্বদা নয়) চুক্তিতে স্বাক্ষর করে তখন এটি বলছে যে "আপনি আমাকে যে বার্তা প্রেরণ করেছেন সেটিকে ফিরে পেতে আমি যুক্তি সরবরাহ করতে আগ্রহী"। এটি NSNotificationCenterএকটি আগ্রহের স্তরের জন্য সাইন আপ করার ক্ষেত্রে অনুরূপ , পার্থক্যটি এমন একটি বস্তু যা প্রতিনিধিদলকে নিয়োগ দেয় কেবল delegateএকবারে একটি হতে পারে, যেখানে একাধিক বস্তু একই জন্য সাইন আপ করতে পারে NSNotification

অ্যাপল ব্যাপকভাবে প্রতিনিধিদের ব্যবহার করে। আরও এবং আরও বেশি কিছু, আপনি দেখতে পাচ্ছেন অ্যাপল তাদের এপিআইর অনেকগুলি এর উপরে সরিয়ে নিয়েছে blocks, যা callbacksঅন্যান্য ভাষায় সমান ।

বলা হচ্ছে, প্রতিনিধিরা এমভিসি বজায় রাখতে সহায়তা করে, যদিও আমি যুক্তি দিই যে প্রতিনিধিরা নিজেই এবং এটি একটি নকশার ধরণ। এটি নিয়ন্ত্রণকারীদের থেকে মডেলগুলি পৃথক করতে সহায়তা করে। যেমন জন কার্টরাইটের উদাহরণে, একটি UITableViewসারি এবং বিভাগগুলি কীভাবে প্রদর্শন করতে হয় তা জানে। UITableViewCellsপারফরম্যান্সের কারণে কীভাবে পুনরায় ব্যবহার করতে হয় তা এটি জানে । এটি অন্যান্য জিনিসগুলির একটি UIScrollViewজানে। তবে কোন কোষ প্রদর্শন করতে হবে তা তা জানে না । কীভাবে এই কোষগুলিকে জনবসতি করতে হবে তা জানে না । প্রদত্ত কোন কোষটি পুনরায় ব্যবহার করতে হবে তা তা জানে না NSIndexPath। এটি সত্যিই নিয়ন্ত্রণকারীর কাজ হওয়া উচিত ways প্রতিনিধিদলটি টেবিল ভিউটিকে এই অ-ভিউ লজিকটিকে এমন কোনও অবজেক্টে অফলোড করার অনুমতি দেয় যা যাইহোক এই দায়িত্ব থাকা উচিত।

এর চেয়ে বড় বিষয়, আপনি কোনও অবজেক্টের পুরো জীবনকালের জন্য একজন প্রতিনিধিতে লক নন। আপনার প্রদত্তের জন্য খুব সহজেই একাধিক ডেটাসোর্স থাকতে পারে UITableViewএবং প্রয়োজন অনুসারে রান সময়ে এটি স্যুইচ করতে পারেন।

সুতরাং, একদিকে, প্রতিনিধি ডেটা সরবরাহ করার জন্য এবং কোনও বস্তু থেকে ইন্টারঅ্যাকশনগুলিতে প্রতিক্রিয়া জানাতে দুর্দান্ত। আপনি UIKit ক্লাস, এই ধরনের একটি অনেক এটা দেখতে পাবেন UITableView, UIPickerView, UICollectionView, ইত্যাদি

আপনি অবজেক্টের মধ্যে তথ্য পাস করতে চাইলে প্রতিনিধিদলও খুব কার্যকর useful আপনি খুব সহজেই আপনার নিজের প্রোটোকল তৈরি করতে এবং সেগুলি অনুসরণ করতে আপনার নিজের অবজেক্টগুলিতে সাইন আপ করতে পারেন। তদ্ব্যতীত, প্রোটোকল পদ্ধতিগুলি @requiredডিফল্টরূপে হয় তবে আপনি কিছু পদ্ধতিতে নির্দিষ্ট করতে পারেন@optional। এটির প্রয়োজন হলে এটি আপনাকে কিছুটা নমনীয়তা দেয়। আসুন ধরা যাক আপনার কাছে পিতামাতাকে দেখার নিয়ামক এবং একটি শিশু দর্শন নিয়ামক রয়েছে। এটি করতে আপনি নতুন কনটেইনমেন্ট এপিআই ব্যবহার করছেন। সাধারণত, যদি আপনার পিতামাতার কাছ থেকে সন্তানের কাছে তথ্য প্রেরণের দরকার হয় তবে আপনি এটি কোনও সম্পত্তি দিয়ে করেন। সম্পন্ন. তবে আপনার যদি সন্তানের কাছ থেকে তথ্য পিতামাতার কাছে ফেরত দেওয়ার দরকার হয়? সন্তানের মধ্যে কিছু পরিবর্তন হতে পারে এবং আপনার পিতামাতাকে জানাতে হবে need অবশ্যই, আপনি নির্দিষ্ট মানগুলিতে কিছু কেভিও করতে পারেন। তবে আপনি কখন জানতে চাইবেন কখন একটি বোতাম টিপবে। চাইল্ড ভিউ কন্ট্রোলারে কেবল একটি নতুন প্রোটোকল তৈরি করুন

@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end

@interface MyChildViewController : UIViewController

@property (weak, nonatomic) id <MyChildDelegate> delegate;

@end

মাইচিল্ডভিউ কনট্রোলার-এ, যখন আপনার বোতামটি টেপ করা হয়েছে, কেবলমাত্র আপনার প্রতিনিধি ডেলিগেট বার্তায় সাড়া দেয় কিনা তা পরীক্ষা করে দেখুন (যদি এটি প্রয়োজন হয় এবং আপনার প্রতিনিধি পদ্ধতিটি বাস্তবায়ন না করে তবে আপনি ক্রাশ করবেন you @optionalআপনার প্রয়োজন হলে পদ্ধতিটি তৈরি করতে পারেন ) এবং প্রেরণ করুন এটা:

- (IBAction)someButtonTapped:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
        [self.delegate buttonWasTappedInChild:self];
    }
}

তারপরে আপনার মাই চাইল্ডভিউ কনট্রোলারের প্রতিনিধি সেট করুন এবং আপনার প্যারেন্ট ভিউ কন্ট্রোলারে selfপ্রয়োগ করুন - (void)buttonWasTappedInChild:(MyChildViewController *)childViewController। গম্ভীর গর্জন! আপনার কাছে সন্তানের কাছ থেকে পিতামাতার কাছে তথ্য পাঠানো হয়েছে। দুটি বস্তুর মধ্যে সম্পর্ক এমনকি পিতামাতার / সন্তানের মতো ঘনিষ্ঠ হওয়ার প্রয়োজন হয় না। এটি একটি পরিষেবার চুক্তি, সুতরাং যতক্ষণ না অবৈধ সাইন আপ প্রয়োজনীয় পদ্ধতিগুলি প্রয়োগ করে দর কষাকষির শেষ অবধি রাখে, আপনি সোনার!

দ্রষ্টব্য: প্রতিনিধিদের দুর্বল / নির্ধারিত বৈশিষ্ট্য হওয়া উচিত, অন্যথায় আপনি এমন একটি রক্ষণশীল চক্র প্রবেশ করবেন যেখানে না কোনও বস্তু হ্রাস করা যাবে।

আশাকরি এটা সাহায্য করবে!


2

প্রতিনিধিরা হ'ল এমন বস্তু যা কিছু নির্দিষ্ট ক্রিয়াকলাপ বাস্তবায়িত করে যখন সাধারণ বস্তুতে এই ফাংশনগুলি বাস্তবায়িত করার কোনও অর্থ হয় না। এটি নির্ভরতা ইনজেকশনের একটি রূপ।

একটি দৃ concrete় উদাহরণের জন্য, ইউআইটিএবল ভিউ ডেলেগেট প্রোটোকলটি দেখুন। এই পদ্ধতিগুলি কোনও টেবিল দৃশ্যের সরাসরি প্রয়োগের জন্য অর্থবোধ করে না, কারণ একটি টেবিল ভিউ সারি নির্বাচন করার ক্রিয়া প্রতিটি অ্যাপ্লিকেশনে এবং সম্ভবত প্রতিটি টেবিল ভিউতে পৃথক হবে। প্রতিনিধিটির একটি পদ্ধতি রয়েছে -tableView:didSelectRowAtIndexPath:যাতে আপনি এমন একটি বস্তু তৈরি করতে পারেন যা আপনি প্রয়োগ করতে চান এমন প্রতিটি পৃথক ক্রিয়াকলাপের জন্য টেবিল ভিউ সাবক্ল্যাসিং না করে সারি নির্বাচন পরিচালনা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.