আমি ব্যবহার এড়ানো UITableViewController
, কারণ এটি একক বস্তুতে প্রচুর দায়িত্ব ফেলে। অতএব আমি UIViewController
উপ উত্সটি ডেটা উত্স এবং প্রতিনিধি থেকে আলাদা করি । সারণী দর্শন প্রস্তুত করা, ডেটা সহ একটি ডেটা উত্স তৈরি করা এবং সেই জিনিসগুলিকে একসাথে আঁকানো ভিউ কন্ট্রোলারের দায়িত্ব। সারণীদর্শনটি যেভাবে উপস্থাপন করা হয়েছে তা পরিবর্তন কন্ট্রোলার পরিবর্তন না করেই করা যেতে পারে এবং একই ধরণের নিয়ামক একাধিক ডেটা উত্সগুলির জন্য ব্যবহার করা যেতে পারে যা সবাই এই প্যাটার্নটি অনুসরণ করে। একইভাবে, অ্যাপ্লিকেশন ওয়ার্কফ্লো পরিবর্তন মানে টেবিলের কী হয় তা নিয়ে চিন্তা না করেই ভিউ কন্ট্রোলারে পরিবর্তন।
আমি পৃথক চেষ্টা করেছি UITableViewDataSource
এবং UITableViewDelegate
বিভিন্ন বস্তুর মধ্যে প্রোটোকল, কিন্তু যে সাধারণত প্রতিনিধি প্রয়োজনের উপর প্রায় প্রতি পদ্ধতি ডেটাউত্স মধ্যে খনন হিসেবে একটি মিথ্যা বিভক্ত হচ্ছে শেষ পর্যন্ত (যেমন নির্বাচনের উপর জানতে প্রতিনিধি চাহিদা কি বস্তু দ্বারা প্রতিনিধিত্ব করা হয় নির্বাচিত সারি)। সুতরাং আমি ডেটাসোর্স এবং প্রতিনিধি উভয়ই একক বস্তুর সাথে শেষ করি। এই অবজেক্টটি সর্বদা একটি পদ্ধতি সরবরাহ করে -(id)tableView: (UITableView *)tableView representedObjectAtIndexPath: (NSIndexPath *)indexPath
যা ডেটা উত্স এবং প্রতিনিধি উভয় দিকই তারা কী কাজ করছে তা জানতে হবে।
এটি আমার "স্তরের 0" উদ্বেগের বিচ্ছেদ। একই স্তরের দৃশ্যে যদি আমাকে বিভিন্ন ধরণের অবজেক্টগুলি উপস্থাপন করতে হয় তবে স্তর 1 জড়িত। উদাহরণস্বরূপ, কল্পনা করুন যে আপনাকে কোনও পরিচিতি অ্যাপ্লিকেশন লিখতে হয়েছিল a একটি পরিচিতির জন্য, আপনার কাছে ফোন নম্বর উপস্থাপনকারী সারি, অন্যান্য সারি ঠিকানাগুলি উপস্থাপন করে, অন্যরা ইমেল ঠিকানা উপস্থাপন করে এবং অন্যান্যও থাকতে পারে। আমি এই পদ্ধতির এড়াতে চাই:
- (UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath {
id object = [self tableView: tableView representedObjectAtIndexPath: indexPath];
if ([object isKindOfClass: [PhoneNumber class]]) {
//configure phone number cell
}
else if …
}
দুটি সমাধান এখনও পর্যন্ত তাদের উপস্থাপন করেছে। একটি হ'ল गतिशीलভাবে একটি নির্বাচক নির্মাণ করা:
- (UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath {
id object = [self tableView: tableView representedObjectAtIndexPath: indexPath];
NSString *cellSelectorName = [NSString stringWithFormat: @"tableView:cellFor%@AtIndexPath:", [object class]];
SEL cellSelector = NSSelectorFromString(cellSelectorName);
return [self performSelector: cellSelector withObject: tableView withObject: object];
}
- (UITableViewCell *)tableView: (UITableView *)tableView cellForPhoneNumberAtIndexPath: (NSIndexPath *)indexPath {
// configure phone number cell
}
এই পদ্ধতির ক্ষেত্রে, if()
নতুন ধরণের সমর্থনের জন্য আপনাকে এপিক ট্রিটি সম্পাদনা করার দরকার নেই - কেবল নতুন ক্লাসকে সমর্থন করে এমন পদ্ধতি যুক্ত করুন। এই টেবিল দর্শনটি কেবলমাত্র এই বিষয়গুলির প্রতিনিধিত্ব করার প্রয়োজন হয় বা এগুলি একটি বিশেষ উপায়ে উপস্থাপন করার প্রয়োজন হলে এটি দুর্দান্ত পদ্ধতির। যদি একই বিষয়গুলি বিভিন্ন উপাত্ত উত্স সহ বিভিন্ন টেবিলগুলিতে উপস্থাপিত করা হয় তবে সেল পদ্ধতির ডেটা উত্সগুলি জুড়ে ভাগ করা প্রয়োজন হওয়ায় এই পদ্ধতিটি ভেঙে যায় — আপনি একটি সাধারণ সুপারক্লাস সংজ্ঞা দিতে পারেন যা এই পদ্ধতিগুলি সরবরাহ করে, বা আপনি এটি করতে পারেন:
@interface PhoneNumber (TableViewRepresentation)
- (UITableViewCell *)tableView: (UITableView *)tableView representationAsCellForRowAtIndexPath: (NSIndexPath *)indexPath;
@end
@interface Address (TableViewRepresentation)
//more of the same…
@end
তারপরে আপনার ডেটা উত্স শ্রেণিতে:
- (UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath {
id object = [self tableView: tableView representedObjectAtIndexPath: indexPath];
return [object tableView: tableView representationAsCellForRowAtIndexPath: indexPath];
}
এর অর্থ হ'ল যে কোনও ডেটা উত্সের জন্য ফোন নম্বর, ঠিকানা ইত্যাদি প্রদর্শন করা দরকার কেবল কোনও টেবিল ভিউ সেলের জন্য যে কোনও অবজেক্ট প্রতিনিধিত্ব করা উচিত তা জানতে চাইতে পারেন । ডেটা উত্স নিজেই অবজেক্টটি প্রদর্শিত হচ্ছে সে সম্পর্কে কিছু জানার দরকার নেই।
"তবে অপেক্ষা করুন," আমি একটি হাইপোটিটিকাল ইন্টারলিওক্টর ইন্টারজেক্ট শুনি, "এটি এমভিসি ভেঙে দেয় না ? আপনি কি মডেল ক্লাসে ভিউ ডিটেল রাখছেন না?"
না, এটি এমভিসি ভঙ্গ করে না। আপনি এই ক্ষেত্রে বিভাগগুলি ডেকরেটারের প্রয়োগ হিসাবে বিবেচনা করতে পারেন ; তাই PhoneNumber
একটি মডেল ক্লাস হয় কিন্তু PhoneNumber(TableViewRepresentation)
একটি দৃশ্য বিভাগ। ডেটা উত্স (একটি নিয়ামক বস্তু) মডেল এবং ভিউয়ের মধ্যে মধ্যস্থতা করে, তাই এমভিসি আর্কিটেকচারটি এখনও ধারণ করে।
অ্যাপলের ফ্রেমওয়ার্কগুলিতে আপনি এই বিভাগগুলির সজ্জা হিসাবে দেখতে পারেন। NSAttributedString
কিছু পাঠ্য এবং বৈশিষ্ট্য ধারণ করে এটি একটি মডেল শ্রেণি। অ্যাপকিট সরবরাহ করে NSAttributedString(AppKitAdditions)
এবং ইউআইকিট সরবরাহ করে NSAttributedString(NSStringDrawing)
, সজ্জা বিভাগগুলি যা এই মডেল ক্লাসগুলিতে অঙ্কন আচরণ যুক্ত করে।