WWDC 2013 के वीडियो में, Apple ने iOS 7 में टेबल व्यू में जगह लेने वाले को प्रदर्शित करने का सुझाव दिया है। टेबल सेल सेल्स के बीच व्यू कैसे डालें और कैसे एनिमेट करें?
इस तरह, Apple कैलेंडर ऐप से:
WWDC 2013 के वीडियो में, Apple ने iOS 7 में टेबल व्यू में जगह लेने वाले को प्रदर्शित करने का सुझाव दिया है। टेबल सेल सेल्स के बीच व्यू कैसे डालें और कैसे एनिमेट करें?
इस तरह, Apple कैलेंडर ऐप से:
जवाबों:
IOS7 के साथ, Apple ने नमूना कोड जारी किया DateCell
।
उन मानों को संपादित करने के लिए तालिका कोशिकाओं में दिनांक ऑब्जेक्ट्स का प्रारूपित प्रदर्शन और UIDatePicker का उपयोग प्रदर्शित करता है। इस तालिका में एक प्रतिनिधि के रूप में, नमूना UIDatePicker नियंत्रण को खोलने के लिए "didSelectRowAtIndexPath" विधि का उपयोग करता है।
IOS 6.x और इससे पहले के लिए, UIViewAnimation का उपयोग UIDatePicker को ऑन-स्क्रीन और डाउन-स्क्रीन पर स्लाइड करने के लिए किया जाता है। IOS 7.x के लिए, UIDatePicker को टेबल व्यू में इन-लाइन जोड़ा जाता है।
UIDatePicker की कार्रवाई विधि सीधे कस्टम तालिका सेल की NSDate संपत्ति सेट करेगी। इसके अलावा, यह नमूना दिखाता है कि कस्टम सेल की दिनांक-स्वरूपित उपस्थिति को प्राप्त करने के लिए NSDateFormatter वर्ग का उपयोग कैसे करें।
आप यहाँ नमूना कोड डाउनलोड कर सकते हैं: DateCell ।
आप मेरे द्वारा पहले दिए गए उत्तर का उपयोग कर सकते हैं या स्विफ्ट में इस नई कक्षा का उपयोग कर सकते हैं मैंने इस कार्य को बहुत सरल और साफ करने के लिए बनाया है : https://github.com/AaronBratcher/TableViewHelper
मुझे लगता है कि Apple द्वारा प्रदान किए गए कोड को कुछ तरीकों से समस्याग्रस्त होना चाहिए:
स्टैटिक सेल टेबल्स के लिए, मैं अपनी डेट पिकर सेल को अपनी डेट डिस्प्ले सेल के नीचे परिभाषित करता हूं और अगर मैं इसे संपादित कर रहा हूं तो एक ध्वज की पहचान है। यदि मैं कर रहा हूँ, तो मैं एक सेल ऊंचाई उपयुक्त है, अन्यथा मैं शून्य की एक सेल ऊंचाई वापस कर देता हूँ।
- (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];
मैंने Apple से DateCell स्रोत लिया है, और स्टोरीबोर्ड फ़ाइल को हटा दिया है।
यदि आप स्टोरीबोर्ड के बिना एक चाहते हैं, तो एक नज़र डालें: https://github.com/ajaygautam/DateCellWithoutStoryboard
UIDatePicker
साथ प्रतिस्थापित करना चाहता हूं UIPickerView
। मैंने कुछ चीजों की कोशिश की और pickerView
प्रत्येक सेल पर दिखाने में सक्षम है लेकिन यह प्रत्येक सेल के साथ अपडेट नहीं होता है। मैंने अपना प्रश्न और कोड यहाँ पोस्ट किया है । कृपया एक नज़र डालें और यह बहुत अच्छा होगा यदि आप मुझे कोई समाधान सुझा सकते हैं।
UIDatePicker
से UIPickerView
लेकिन कीड़े के जोड़े के साथ बदलने में कामयाब रहा । 1. जब आप UIPickerView
टेबल को खोलते और स्क्रॉल करते हैं तो यह क्रैश हो जाता है । 2. यह स्वचालित रूप UILabel
से तालिका की निचली पंक्तियों में मूल्यों का विवरण देता है जब मूल्यों को शीर्ष पंक्तियों पर विवरण लेबल को सौंपा जा रहा है। यहाँ मेरा कोड है
इसके बारे में सबसे अच्छे ट्यूटोरियल में से एक iOS 7 इन-लाइन UIDatePicker - भाग 2 है । मूल रूप से यहां मैं स्थिर तालिका दृश्य कोशिकाओं का उपयोग करता हूं और कुछ अतिरिक्त विधियों को लागू करता हूं। मैंने इसके लिए Xamarin और C # का उपयोग किया:
आपको सक्रिय होना पड़ेगा 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
मुझे ऐप्पल की तारीख के उदाहरण में एक दोष का जवाब मिला, जहां आपके पास अंतिम तिथि के नीचे एक पंक्ति होनी चाहिए या आपको एक त्रुटि मिल सकती है। CellForRowAtIndexPath विधि में आइटम के साथ आइटम को बदलें
NSArray *itemsArray = [self.dataArray objectAtIndex:indexPath.section];
NSDictionary *itemData = nil;
if(![indexPath isEqual:self.datePickerIndexPath])
itemData = [itemsArray objectAtIndex:modelRow];
नमूना कोड की जगह लेने के बाद मैं अब एक डेटपिकर सेल प्रदर्शित कर सकता हूं, उसके नीचे कोई सेल नहीं है।
मैं सिर्फ स्टैक्वेरफ्लो में शामिल हुआ, अगर यह गलत जगह पर है या कहीं और है तो मैं माफी मांगता हूं।
जब कई वर्गों के साथ प्रयोग किया जाता है, तो हारून ब्रेचर के जवाब ने काम किया। एनिमेशन थोड़ा तड़का हुआ था और यह अगले खंडों को बहुत अच्छी तरह से स्लाइड नहीं करता था। इसे ठीक करने के लिए मैंने अनुभागों के अगले सेट के माध्यम से पुनरावृति की और पंक्तियों को दिनांक पिकर की ऊँचाई के बराबर ही अनुवादित किया।
मैंने संपादित किया :SelectRowAtIndexPath:
// 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];
}];
}
पिछले उत्तरों में जोड़ना,
मैंने @datinc और @Aaron Bratcher दोनों तरह के समाधानों को आज़माया, दोनों ने बहुत अच्छा काम किया लेकिन एनीमेशन एक समूहबद्ध स्थिर तालिका दृश्य में इतना साफ नहीं था।
इसके साथ खेलने के बाद मैं थोड़ा इस कोड के लिए गया जो मेरे लिए साफ और महान काम करता है -
- (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];
पंक्ति को अद्यतन करने के लिए, इस तरह से तालिका अनुभागों और कोशिकाओं के बाकी हिस्से एनिमेट नहीं कर रहे हैं।
आशा है कि यह किसी की मदद करता है।
शनि
पिछले उत्तर और @Aaron Bratcher समाधान में जोड़ना ...
IOS 9 के बाद से मुझे तड़का हुआ एनिमेशन मिल रहा था, और टेबल को लोड होने में थोड़ा समय लग रहा था, और परेशान होने के लिए पर्याप्त था। मैंने स्टोरीबोर्ड से लोड होने की तिथि लेने वालों को धीमा कर दिया। स्टोरीबोर्ड में प्रोग्रामर के बजाय पिकर जोड़ने से लोडिंग प्रदर्शन में सुधार हुआ, और उप-उत्पाद के रूप में, एनीमेशन चिकनी है।
स्टोरीबोर्ड से डेट पिकर निकालें और एक खाली सेल लें, जिसे आपने पिछले उत्तरों की तरह ऊँचाई पर सेट किया है, और फिर viewDidLoad पर एक इनिशियल कॉल करें:
- (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;
}
}
IOS 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()
}
}
स्थैतिक स्थिर संख्याओं के बिना समस्या को हल करने का एक और तरीका यहां दिया गया है। सभी कोशिकाओं का उपयोग स्थिर और गतिशील तालिका विचारों में किया जा सकता है। यह विधि दोनों शीर्षक और तारीख पिकर के लिए एकल सेल का उपयोग करती है!
Btw आप अपनी इच्छा के रूप में अपनी मेज में कई तारीख पिकर हो सकता है!
UITableViewCell उपवर्ग बनाएं :
आपकी सभी तालिका दृश्य कोशिकाएं इस वर्ग से विरासत में मिली हैं और आपको प्रत्येक पंक्ति के लिए सेल की ऊंचाई मैन्युअल रूप से सेट करनी होगी।
//
// 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
हमारे CPTableViewCell से CPDatePickerTableViewCell क्लास बनाएं
//
// 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;
}
इंटरफ़ेस बिल्डर में बाधाओं को कैसे सेट करें, उदाहरण
इसके अतिरिक्त मैंने UITextField और UITextView के लिए कस्टम सेल कक्षाएं लिखी हैं जहाँ tableView: didSelectRowAtIndexPath: सेल चुने जाने पर कहा जाता है!
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
स्विफ्ट संस्करण में DateCell का उपयोग करने का सबसे आसान तरीका: इस उदाहरण का उपयोग करें ।
अपनी परियोजना के लिए " DateCellTableViewController.swift " कक्षा खींचें ।
"Main.storyboard" खोलें और " DateCell " ViewController Object को कॉपी करें और इसे अपने स्टोरीबोर्ड में पेस्ट करें।