ডাব্লুডাব্লুডিসি 2013 ভিডিওতে, অ্যাপল আইওএসে একটি টেবিল ভিউটিতে পিকারটি প্রদর্শন করার পরামর্শ দিচ্ছে 7.. টেবিল ভিউ সেলগুলির মধ্যে একটি ভিউ কীভাবে সন্নিবেশ করাতে এবং প্রাণবন্ত করা যায়?
অ্যাপল ক্যালেন্ডার অ্যাপ্লিকেশন থেকে এটি পছন্দ করুন:
ডাব্লুডাব্লুডিসি 2013 ভিডিওতে, অ্যাপল আইওএসে একটি টেবিল ভিউটিতে পিকারটি প্রদর্শন করার পরামর্শ দিচ্ছে 7.. টেবিল ভিউ সেলগুলির মধ্যে একটি ভিউ কীভাবে সন্নিবেশ করাতে এবং প্রাণবন্ত করা যায়?
অ্যাপল ক্যালেন্ডার অ্যাপ্লিকেশন থেকে এটি পছন্দ করুন:
উত্তর:
আইওএস 7 এর সাথে অ্যাপল নমুনা কোডটি প্রকাশ করেছে DateCell
।
টেবিল কোষগুলিতে তারিখের অবজেক্টগুলির বিন্যাসিত প্রদর্শন এবং সেই মানগুলি সম্পাদনা করতে ইউআইডিটপিকার ব্যবহার করে। এই টেবিলের প্রতিনিধি হিসাবে, নমুনাটি ইউআইডিটপিকার নিয়ন্ত্রণটি খুলতে "didSelectRowAtIndexPath" পদ্ধতিটি ব্যবহার করে।
আইওএস x.x এবং এর আগের জন্য, ইউআইভিউএনিমেশনটি ইউআইডিটিপিকারকে অন-স্ক্রিনে ও ডাউন-স্ক্রিন ডাউন স্লাইড করার জন্য ব্যবহৃত হয়। আইওএস x.x এর জন্য, ইউআইডিটপিকারটি টেবিল দৃশ্যে লাইনে যুক্ত করা হয়েছে।
ইউআইডিটপিকারের অ্যাকশন পদ্ধতিটি সরাসরি কাস্টম টেবিল ঘরের এনএসডিট সম্পত্তি সেট করবে। এছাড়াও, এই নমুনাটি দেখায় যে কীভাবে কাস্টম সেলের তারিখ-বিন্যাসিত উপস্থিতি অর্জন করতে এনএসডিট ফরমেটার ক্লাস ব্যবহার করা যায়।
আপনি এখানে নমুনা কোডটি ডাউনলোড করতে পারেন: ডেটসেল ।
আপনি উত্তর আমি আগে নিচের দিয়েছিলেন ব্যবহার করুন অথবা সুইফট আমি এই নতুন বর্গ ব্যবহার করতে পারেন এই কাজের একটি করতে প্রণীত অনেক সহজ এবং ক্লিনার: https://github.com/AaronBratcher/TableViewHelper
আমি অ্যাপল দ্বারা প্রদত্ত কোডটি বেশ কয়েকটি উপায়ে সমস্যাযুক্ত হতে দেখছি:
স্ট্যাটিক সেল টেবিলগুলির জন্য, আমি আমার তারিখ প্রদর্শন কক্ষের নীচে আমার তারিখ চয়নকারী সেলটি সংজ্ঞায়িত করি এবং আমি সম্পাদনা করছি কিনা তা চিহ্নিত করে একটি পতাকা রয়েছে। আমি যদি থাকি তবে আমি উপযুক্ত একটি ঘরের উচ্চতা ফিরিয়ে দেব, অন্যথায় আমি শূন্যের একটি উচ্চতা ফিরিয়ে আনব।
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0 && indexPath.row == 2) { // this is my picker cell
if (editingStartTime) {
return 219;
} else {
return 0;
}
} else {
return self.tableView.rowHeight;
}
}
তারিখটি দেখানো সারিটি ক্লিক করা হলে, আমি পতাকাটি পরিবর্তন করি এবং চয়নকারীকে দেখানোর জন্য আপডেট অ্যানিমেশন করি।
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0 && indexPath.row == 1) { // this is my date cell above the picker cell
editingStartTime = !editingStartTime;
[UIView animateWithDuration:.4 animations:^{
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:2 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView reloadData];
}];
}
}
যদি আমার একই টেবিলে একাধিক তারিখ / সময় বাছাইকারী থাকে তবে আমি ক্লিক অনুযায়ী পতাকাগুলি সেট করে যথাযথ সারিগুলি পুনরায় লোড করব। আমি খুঁজে পেয়েছি যে আমি আমার স্থিতিশীল টেবিল রাখতে পারি, অনেক কম কোড ব্যবহার করতে পারি এবং কী হচ্ছে তা বোঝা সহজ।
স্টোরিবোর্ড এবং একটি স্ট্যাটিক টেবিল ব্যবহার করে আমি নিম্নলিখিত কোডটি ব্যবহার করে একই ফলাফল অর্জন করতে সক্ষম হয়েছি। এটি একটি দুর্দান্ত সমাধান কারণ আপনার যদি অনেকগুলি বিচিত্র আকারের কক্ষ থাকে বা একাধিক কক্ষ থাকতে চান যা গতিশীলভাবে দেখানো / গোপন করা হয়েছে তবে এই কোডটি এখনও কাজ করবে।
@interface StaticTableViewController: UITableViewController
@property (weak, nonatomic) IBOutlet UITableViewCell *dateTitleCell; // cell that will open the date picker. This is linked from the story board
@property (nonatomic, assign, getter = isDateOpen) BOOL dateOpen;
@end
@implementation StaticTableViewController
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// This is the index path of the date picker cell in the static table
if (indexPath.section == 1 && indexPath.row == 1 && !self.isDateOpen){
return 0;
}
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
[tableView beginUpdates];
if (cell == self.dateTitleCell){
self.dateOpen = !self.isDateOpen;
}
[tableView reloadData];
[self.tableView endUpdates];
}
[tableView reloadData];
কল প্রয়োজন হয় না। বর্তমানে এটি সারি নির্বাচনটি অক্ষম করে, তবে এটির মতো সারিটি অনির্বাচিত করা ভাল:[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
আমি অ্যাপল থেকে ডেটসেল উত্সটি নিয়েছি এবং স্টোরিবোর্ড ফাইলটি সরিয়েছি।
আপনি যদি স্টোরিবোর্ড ছাড়াই চান তবে একবার দেখুন: https://github.com/ajaygautam/DateCellWithoutStoryboard
UIDatePicker
সঙ্গে UIPickerView
। আমি কয়েকটি জিনিস চেষ্টা করেছিলাম এবং pickerView
প্রতিটি ঘরে প্রদর্শিত করতে সক্ষম হয়েছি তবে এটি প্রতিটি কক্ষের সাথে আপডেট হয় না। আমি আমার প্রশ্ন এবং কোড এখানে পোস্ট করেছি । দয়া করে একবার দেখুন এবং যদি আপনি আমাকে সমাধানের পরামর্শ দিতে পারেন তবে এটি খুব দয়াবান হবে।
UIDatePicker
সঙ্গে UIPickerView
কিন্তু বাগ কয়েক সঙ্গে। 1. আপনি যখন UIPickerView
টেবিলটি খুলুন এবং স্ক্রোল করবেন তখন এটি ক্রাশ হয় । ২. UILabel
মানগুলি শীর্ষ সারিগুলিতে বিশদ বিবরণে নির্ধারিত হওয়ার পরে এটি স্বয়ংক্রিয়ভাবে সারণীর নীচের সারিগুলিতে বিশদকে মান নির্ধারণ করে । এখানে আমার কোডটি রয়েছে
এটি সম্পর্কে সেরা টিউটোরিয়ালগুলির মধ্যে একটি হ'ল আইওএস 7 ইন-লাইন ইউআইডিটপিকার - পার্ট 2 । মূলত এখানে আমি স্থিতিশীল টেবিল ভিউ সেল ব্যবহার করি এবং কিছু অতিরিক্ত পদ্ধতি প্রয়োগ করি। আমি এর জন্য জামারিন এবং সি # ব্যবহার করেছি:
আপনি সক্রিয় করতে হবে Clip Subviews
।
উচ্চতা নির্ধারণ:
public override float GetHeightForRow (UITableView tableView, NSIndexPath indexPath)
{
if (indexPath.Row == 4) {
return (datePickerIsShowing) ? 206f : 0.0f;
}
return base.GetHeightForRow(tableView,indexPath);
}
ক্লাস ভেরিয়েবলের চেয়ে: private bool datePickerIsShowing = false;
তারিখ চয়নকারী দেখান:
private void showDatePickerCell(){
datePickerIsShowing = true;
this.TableView.BeginUpdates ();
this.TableView.EndUpdates ();
this.datePicker.Hidden = false;
this.datePicker.Alpha = 0.0f;
UIView.Animate (0.25, animation:
() => {
this.datePicker.Alpha = 1.0f;
}
);
}
তারিখ চয়নকারী লুকান:
private void hideDatePickerCell(){
datePickerIsShowing = false;
this.TableView.BeginUpdates ();
this.TableView.EndUpdates ();
UIView.Animate (0.25,
animation: () => {
this.datePicker.Alpha = 0.0f;
},
completion: () => {
this.datePicker.Hidden = true;
}
);
}
এবং এই ফাংশন কল:
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
if (indexPath.Row == 3) {
if (datePickerIsShowing) {
hideDatePickerCell ();
} else {
showDatePickerCell ();
}
}
this.TableView.DeselectRow (indexPath, true);
}
টেবিলভিউতে একটি ইনলাইন চয়নকারী ইনলাইন যুক্ত করার প্রক্রিয়াটিকে সহজ করার জন্য আমি আমার নিজস্ব কাস্টম ভিউ নিয়ামক তৈরি করেছি। আপনি কেবল এটি সাবক্লাস করেন এবং কিছু সাধারণ নিয়ম অনুসরণ করেন এবং এটি তারিখ চয়নকারী উপস্থাপনা পরিচালনা করে।
আপনি এখানে এটি একটি উদাহরণ প্রকল্পের সাথে এটি সন্ধান করতে পারেন যা এটি কীভাবে ব্যবহার করতে হয় তা বোঝায় : https://github.com/ale84/ALEInlineDatePickerViewController
আমি অ্যাপলের ডেটसेल উদাহরণের একটি ত্রুটির উত্তর পেয়েছি যেখানে আপনার অবশ্যই শেষ ডেটসেলের নীচে সারি থাকতে হবে বা আপনি একটি ত্রুটি পেয়েছেন। সেলফোর্ডআউটইন্ডেক্সপথ পদ্ধতিতে আইটেমডেটা লাইনটি প্রতিস্থাপন করুন
NSArray *itemsArray = [self.dataArray objectAtIndex:indexPath.section];
NSDictionary *itemData = nil;
if(![indexPath isEqual:self.datePickerIndexPath])
itemData = [itemsArray objectAtIndex:modelRow];
নমুনা কোডটি প্রতিস্থাপনের পরে আমি এখন ডেটপিকার সেলটি তার নীচে কোনও সেল ছাড়াই প্রদর্শন করতে পারি।
আমি সবেমাত্র স্ট্যাকওভারফ্লোতে যোগ দিয়েছি তাই যদি এটি ভুল জায়গায় হয় বা অন্য কোথাও হয় তবে আমি ক্ষমা চাই।
অ্যারন ব্র্যাচারের উত্তর একাধিক বিভাগের সাথে ব্যবহার না করা ব্যতীত কাজ করেছিল। অ্যানিমেশনগুলি কিছুটা চপি ছিল এবং এটি পরবর্তী বিভাগগুলি খুব ভালভাবে স্লাইড করে না। এটি ঠিক করার জন্য আমি বিভাগের পরবর্তী সেটটি দিয়ে পুনরাবৃত্তি করেছি এবং তারিখ চয়নকারীর উচ্চতার সমান পরিমাণে সারিগুলিকে অনুবাদ করেছি।
আমি doSelectRowAtIndexPath এ সম্পাদনা করেছি:
// Return Data to delegate: either way is fine, although passing back the object may be more efficient
// [_delegate imageSelected:currentRecord.image withTitle:currentRecord.title withCreator:currentRecord.creator];
// [_delegate animalSelected:currentRecord];
if (indexPath.section == 1 && indexPath.row == 0) { // this is my date cell above the picker cell
editingStartTime = !editingStartTime;
[UIView animateWithDuration:.4 animations:^{
int height = 0;
if (editingStartTime) {
height = 162;
}
UITableViewCell* temp = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1]];
[temp setFrame:CGRectMake(temp.frame.origin.x, temp.frame.origin.y, temp.frame.size.width, height)];
for (int x = 2; x < [tableView numberOfSections]; x++) {
for (int y = 0; y < [tableView numberOfRowsInSection:x]; y++) {
UITableViewCell* temp = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:y inSection:x]];
int y_coord = temp.frame.origin.y-162;
if (editingStartTime) {
y_coord = temp.frame.origin.y+162;
}
[temp setFrame:CGRectMake(temp.frame.origin.x, y_coord, temp.frame.size.width, temp.frame.size.height)];
}
}
}completion:^(BOOL finished){
[self.tableView reloadData];
}];
}
পূর্ববর্তী উত্তরগুলি যুক্ত করা,
আমি @ ড্যাটিনক এবং @ অ্যারন ব্র্যাচার সমাধান উভয়ই চেষ্টা করেছিলাম, উভয়ই দুর্দান্ত কাজ করেছে তবে অ্যানিমেশনটি একটি দলবদ্ধ স্ট্যাটিক টেবিল ভিউতে এত পরিষ্কার ছিল না।
এটির সাথে কিছুটা খেলার পরে আমি এই কোডটি পেয়েছিলাম যা আমার পক্ষে পরিষ্কার এবং দুর্দান্ত কাজ করে -
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0 && indexPath.row == 1)
{
if (self.isPickerOpened)
{
return 162;
}
else
{
return 0;
}
}
else
{
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0 && indexPath.row == 0) {
[tableView beginUpdates];
self.isPickerOpened = ! self.isPickerOpened;
[super tableView:tableView heightForRowAtIndexPath:indexPath];
[self.tableView endUpdates];
}
}
মূল পরিবর্তনটি ব্যবহার করা -
[super tableView:tableView heightForRowAtIndexPath:indexPath];
সারিটি আপডেট করতে, এইভাবে টেবিলের বাকী অংশ এবং কক্ষগুলি অ্যানিমেটেড হয় না।
আশা করি এটি কাউকে সাহায্য করবে।
শনি
পূর্ববর্তী উত্তরগুলি এবং @ অ্যারন ব্র্যাচার সমাধানগুলিতে যুক্ত করা হচ্ছে ...
আমি আইওএস 9-এর পর থেকে চপি অ্যানিমেশন পাচ্ছিলাম, এবং টেবিলটি লোড হতে কিছুটা সময় নিচ্ছিল, এবং বিরক্তিকর হওয়ার জন্য যথেষ্ট ছিল। আমি স্টোরবোর্ড থেকে লোড করতে ধীর হয়ে যাওয়ার তারিখ বাছাইকারীদের সাথে সংকীর্ণ করেছি। স্টোরিবোর্ডের চেয়ে প্রোগ্রামারিকভাবে পিক্স যুক্ত করা লোডিং পারফরম্যান্সের উন্নতি করেছে এবং উপ-পণ্য হিসাবে, অ্যানিমেশনটি মসৃণ।
স্টোরিবোর্ড থেকে তারিখ চয়নকারীটিকে সরিয়ে ফেলুন এবং একটি খালি ঘর করুন, যা আপনি পূর্ববর্তী উত্তরের মতো উচ্চতা নির্ধারণ করুন এবং তারপরে ভিডডিডএডটিতে একটি প্রাথমিক কল করুন:
- (void)initialiseDatePickers
{
self.isEditingStartTime = NO;
self.startTimePickerCell.clipsToBounds = YES;
UIDatePicker *startTimePicker = [[UIDatePicker alloc] init];
[startTimePicker addTarget:self action:@selector(startTimePickerChanged:) forControlEvents:UIControlEventValueChanged];
[self.startTimePickerCell addSubview:startTimePicker];
}
তারপরে ক্রিয়াটি যেমন বাস্তবায়ন করুন
- (IBAction)startTimePickerChanged:(id)sender
{
NSLog(@"start time picker changed");
}
এটি টেবিলটি আগের চেয়ে অনেক দ্রুত লোড করে। অ্যানিমেশন লাইনটি didSelectRowAtIndexPath
এটিকে (ymmv) ছাড়াই সহজেই অ্যানিম্যাট করায় আপনি এটিকেও সরিয়ে ফেলুন।
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0 && indexPath.row == 1) { // this is my date cell above the picker cell
editingStartTime = !editingStartTime;
}
}
অ্যানিমেশন ব্যতীত এই উত্তরটি ব্যবহার করা আইওএস 8.1 এ সঠিকভাবে কাজ করে। আমি এটিকে নীচে সুইফটে রূপান্তরিত করেছি:
import UIKit
class TableViewController: UITableViewController {
var editingCell: Bool = false
@IBOutlet weak var myCell: UITableViewCell!
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
// Change the section and row to the title cell the user taps to reveal
// the cell below
if (indexPath.section == 0 && indexPath.row == 2 && !editingCell) {
return 0
} else {
return self.tableView.rowHeight
}
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView.deselectRowAtIndexPath(indexPath, animated: false);
var cell = tableView.cellForRowAtIndexPath(indexPath)
self.tableView.beginUpdates()
if (cell == self.myCell) {
editingType = !editingType;
}
self.tableView.endUpdates()
}
}
স্থির ধ্রুবক সংখ্যা ছাড়াই সমস্যাটি সমাধানের আরও একটি উপায় এখানে। সমস্ত কক্ষ স্থিতিশীল এবং গতিশীল টেবিল দর্শনগুলিতে ব্যবহার করা যেতে পারে। এই পদ্ধতিতে শিরোনাম এবং তারিখ চয়নকারী উভয়ের জন্য একক ঘর ব্যবহার করা হয়!
বিটিডব্লু আপনার ইচ্ছায় আপনার টেবিলে যতগুলি ডেট পিকার থাকতে পারে!
একটি ইউআইটিএবল ভিউসেল সাবক্লাস তৈরি করুন :
আপনার সমস্ত টেবিল দেখার ঘরগুলি এই শ্রেণি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হতে হবে এবং আপনার অবশ্যই প্রতিটি সারির জন্য ঘরের উচ্চতা ম্যানুয়ালি সেট করতে হবে।
//
// CPTableViewCell.h
//
// Copyright (c) CodePigeon. All rights reserved.
//
@class CPTableViewCell;
#define kUIAnimationDuration 0.33f
@protocol CPTableViewCellDelegate <NSObject>
@required
- (void)tableViewCellDidChangeValue:(CPTableViewCell *)cell;
@optional
- (void)tableViewCellDidBecomeFirstResponder:(CPTableViewCell *)cell;
- (void)tableViewCellResignedFirstResponder:(CPTableViewCell *)cell;
@end
@interface CPTableViewCell : UITableViewCell
@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, weak) IBOutlet CPTableViewCell *nextCell;
@property (nonatomic, weak) IBOutlet id<CPTableViewCellDelegate> delegate;
@property (nonatomic, copy) IBInspectable NSString *dataBindKey;
@property (nonatomic) IBInspectable CGFloat height;
@property (nonatomic, readonly) BOOL isFirstResponder;
@property (nonatomic) BOOL isEnabled;
- (void)commonInit;
- (id)value;
- (void)setValue:(id)value;
@end
//
// CPTableViewCell.m
//
// Copyright (c) CodePigeon. All rights reserved.
//
#import "CPTableViewCell.h"
@interface CPTableViewCell ()
@end
@implementation CPTableViewCell
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (!self)
return nil;
[self commonInit];
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (!self)
return nil;
[self commonInit];
return self;
}
- (void)commonInit
{
_isFirstResponder = NO;
_isEnabled = YES;
}
- (BOOL)canBecomeFirstResponder
{
return _isEnabled;
}
- (BOOL)becomeFirstResponder
{
if ([_delegate respondsToSelector:@selector(tableViewCellDidBecomeFirstResponder:)])
[_delegate tableViewCellDidBecomeFirstResponder:self];
return _isFirstResponder = YES;
}
- (BOOL)resignFirstResponder
{
if (_isFirstResponder)
{
if ([_delegate respondsToSelector:@selector(tableViewCellResignedFirstResponder:)])
[_delegate tableViewCellResignedFirstResponder:self];
_isFirstResponder = NO;
}
return _isFirstResponder;
}
- (id)value
{
[self doesNotRecognizeSelector:_cmd];
return nil;
}
- (void)setValue:(id)value
{
[self doesNotRecognizeSelector:_cmd];
}
@end
আমাদের সিপিটিবেল ভিউসেল থেকে সিপিডেটপিকারটেবলভিউসেল ক্লাস তৈরি করুন
//
// CPDatePickerTableViewCell.h
//
// Copyright (c) CodePigeon. All rights reserved.
//
#import "CPTableViewCell.h"
@interface CPDatePickerTableViewCell : CPTableViewCell
@property (nonatomic, copy) IBInspectable NSString *dateFormat;
@property (nonatomic, weak) IBOutlet UILabel *titleLabel;
@property (nonatomic, weak) IBOutlet UILabel *dateLabel;
@property (nonatomic, weak) IBOutlet UIDatePicker *datePicker;
@end
//
// CPDatePickerTableViewCell.m
//
// Copyright (c) CodePigeon. All rights reserved.
//
#import "CPDatePickerTableViewCell.h"
#define kCPDatePickerTableViewCellPickerHeight 162.f
@interface CPDatePickerTableViewCell () <UITextFieldDelegate, UIPickerViewDelegate>
{
NSDateFormatter *_dateFormatter;
BOOL _isOpen;
}
@end
@implementation CPDatePickerTableViewCell
- (void)awakeFromNib
{
[super awakeFromNib];
_dateFormatter = [NSDateFormatter new];
[_dateFormatter setDateFormat:_dateFormat];
self.selectionStyle = UITableViewCellSelectionStyleNone;
_dateLabel.text = [_dateFormatter stringFromDate:_datePicker.date];
_datePicker.alpha = 0.f;
_isOpen = NO;
}
- (BOOL)becomeFirstResponder
{
if (_isOpen == NO)
{
self.height += kCPDatePickerTableViewCellPickerHeight;
}
else
{
self.height -= kCPDatePickerTableViewCellPickerHeight;
}
[UIView animateWithDuration:kUIAnimationDuration animations:^{
_datePicker.alpha = _isOpen ? 0.0f : 1.0f;
}];
[self.tableView beginUpdates];
[self.tableView endUpdates];
_isOpen = !_isOpen;
[self.tableView endEditing:YES];
return [super becomeFirstResponder];
}
- (BOOL)resignFirstResponder
{
if (_isOpen == YES)
{
self.height -= kCPDatePickerTableViewCellPickerHeight;
[UIView animateWithDuration:kUIAnimationDuration animations:^{
_datePicker.alpha = 0.0f;
}];
[self.tableView beginUpdates];
[self.tableView endUpdates];
_isOpen = NO;
}
return [super resignFirstResponder];
}
- (id)value
{
return _datePicker.date;
}
- (void)setValue:(NSDate *)value
{
_datePicker.date = value;
_dateLabel.text = [_dateFormatter stringFromDate:_datePicker.date];
}
- (IBAction)datePickerValueChanged:(UIDatePicker *)sender
{
[_dateLabel setText:[_dateFormatter stringFromDate:_datePicker.date]];
[self.delegate tableViewCellDidChangeValue:self];
}
@end
আপনার দৃষ্টিতে নিয়ামক এই দুটি প্রতিনিধি পদ্ধতি বাস্তবায়ন করুন
#pragma mark - UITableViewDelegate methods
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CPTableViewCell *cell = (CPTableViewCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath];
return [cell height];
}
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
CPTableViewCell *cell = (CPTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
if ([cell canBecomeFirstResponder])
{
[cell becomeFirstResponder];
}
if (cell != _selectedCell)
{
[_selectedCell resignFirstResponder];
}
_selectedCell = cell;
return YES;
}
ইন্টারফেস বিল্ডারে কীভাবে সীমাবদ্ধতা সেট আপ করা যায় তার উদাহরণ
অতিরিক্তভাবে আমি ইউআইটিেক্সটফিল্ড এবং ইউআইটিেক্সটভিউয়ের জন্য কাস্টম সেল ক্লাস লিখেছি যেখানে টেবিলভিউ: ডায়সিলিটরোউটিআইটেক্সপথ: সেল নির্বাচন করা হলে ডাকা হয়!
CPTextFieldTableViewCell
//
// CPTextFieldTableViewCell.h
//
// Copyright (c) CodePigeon. All rights reserved.
//
#import "CPTableViewCell.h"
@interface CPTextFieldTableViewCell : CPTableViewCell
@property (nonatomic, weak) IBOutlet UITextField *inputTextField;
@end
//
// CPTextFieldTableViewCell.m
//
// Copyright (c) CodePigeon. All rights reserved.
//
#import "CPTextFieldTableViewCell.h"
@interface CPTextFieldTableViewCell () <UITextFieldDelegate>
@end
@implementation CPTextFieldTableViewCell
- (void)awakeFromNib
{
[super awakeFromNib];
self.selectionStyle = UITableViewCellSelectionStyleNone;
_inputTextField.userInteractionEnabled = NO;
_inputTextField.delegate = self;
}
- (BOOL)becomeFirstResponder
{
_inputTextField.userInteractionEnabled = YES;
[_inputTextField becomeFirstResponder];
return [super becomeFirstResponder];
}
- (BOOL)resignFirstResponder
{
_inputTextField.userInteractionEnabled = NO;
return [super resignFirstResponder];
}
- (void)setIsEnabled:(BOOL)isEnabled
{
[super setIsEnabled:isEnabled];
_inputTextField.enabled = isEnabled;
}
- (id)value
{
return _inputTextField.text;
}
- (void)setValue:(NSString *)value
{
_inputTextField.text = value;
}
#pragma mark - UITextFieldDelegate methods
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self.delegate tableViewCellDidChangeValue:self];
}
@end
CBTextViewTableViewCell
পাঠ্যটি নতুন লাইনে আবৃত হলে ঘরের উচ্চতা গতিশীল এবং সারি বাড়বে!
//
// CBTextViewTableViewCell.h
//
// Copyright (c) CodePigeon. All rights reserved.
//
#import "CPTableViewCell.h"
@interface CPTextViewTableViewCell : CPTableViewCell
@property (nonatomic, weak) IBOutlet UITextView *inputTextView;
@end
//
// CBTextViewTableViewCell.m
//
// Copyright (c) CodePigeon. All rights reserved.
//
#import "CPTextViewTableViewCell.h"
@interface CPTextViewTableViewCell () <UITextViewDelegate>
{
UITextView *_heightTextView;
}
@end
@implementation CPTextViewTableViewCell
@synthesize height = _height;
- (void)awakeFromNib
{
[super awakeFromNib];
self.selectionStyle = UITableViewCellSelectionStyleNone;
_inputTextView.userInteractionEnabled = NO;
_inputTextView.delegate = self;
_inputTextView.contentInset = UIEdgeInsetsZero;
_inputTextView.scrollEnabled = NO;
}
- (CGFloat)height
{
if (!_heightTextView)
{
CGRect frame = (CGRect) {
.origin = CGPointMake(0.f, 0.f),
.size = CGSizeMake(_inputTextView.textInputView.frame.size.width, 0.f)
};
_heightTextView = [[UITextView alloc] initWithFrame:frame];
_heightTextView.font = [UIFont systemFontOfSize:_inputTextView.font.pointSize];
_heightTextView.textColor = UIColor.whiteColor;
_heightTextView.contentInset = UIEdgeInsetsZero;
}
_heightTextView.text = _inputTextView.text;
CGSize size = [_heightTextView sizeThatFits:CGSizeMake(_inputTextView.textInputView.frame.size.width, FLT_MAX)];
return size.height > _height ? size.height + _inputTextView.font.pointSize : _height;
}
- (BOOL)becomeFirstResponder
{
_inputTextView.userInteractionEnabled = YES;
[_inputTextView becomeFirstResponder];
return [super becomeFirstResponder];
}
- (BOOL)resignFirstResponder
{
_inputTextView.userInteractionEnabled = NO;
return [super resignFirstResponder];
}
- (void)setIsEnabled:(BOOL)isEnabled
{
[super setIsEnabled:isEnabled];
_inputTextView.editable = isEnabled;
}
- (id)value
{
return _inputTextView.text;
}
- (void)setValue:(NSString *)value
{
_inputTextView.text = value;
[_inputTextView setNeedsLayout];
[_inputTextView layoutIfNeeded];
}
#pragma mark - UITextViewDelegate methods
- (void)textViewDidChange:(UITextView *)textView
{
[self.delegate tableViewCellDidChangeValue:self];
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
@end
সুইফট সংস্করণে ডেটসেল ব্যবহারের সবচেয়ে সহজ উপায়: এই উদাহরণটি ব্যবহার করুন ।
আপনার প্রকল্পে " তারিখসেলট্যাবলভিউকন্ট্রোলআর সুইফ্ট " শ্রেণি টানুন ।
"মেইন.স্টরিবোর্ড" খুলুন এবং " স্টেটকেল " ভিউকন্ট্রোলার অবজেক্টটি অনুলিপি করুন এবং এটি আপনার স্টোরিবোর্ডে রেখে দিন।