আইওএস 7 - একটি টেবিল ভিউতে স্থিতি চয়নকারীকে কীভাবে প্রদর্শিত করবেন?


121

ডাব্লুডাব্লুডিসি 2013 ভিডিওতে, অ্যাপল আইওএসে একটি টেবিল ভিউটিতে পিকারটি প্রদর্শন করার পরামর্শ দিচ্ছে 7.. টেবিল ভিউ সেলগুলির মধ্যে একটি ভিউ কীভাবে সন্নিবেশ করাতে এবং প্রাণবন্ত করা যায়?

অ্যাপল ক্যালেন্ডার অ্যাপ্লিকেশন থেকে এটি পছন্দ করুন:

ইন-প্লেস তারিখ চয়নকারী


এটি কোন ডাব্লুডব্লিউডিসির ভিডিও? আমি কেন এটি iOS7- নির্দিষ্ট, তা বোঝার চেষ্টা করছি এবং যদি এর কোনও কারণ থাকে তবে পূর্ববর্তী সংস্করণগুলিতে এটি করা যায়নি।
ক্লাফু

4
এটি খুঁজে পেয়েছে, এটি "আইওএস ইউজার ইন্টারফেস ডিজাইনে নতুন কি আছে" (ধন্যবাদ ASCIIwwdc)। যুক্তিটি হ'ল পুরাতন স্টাইলিংটি সঠিকভাবে ইনলাইন দেখাচ্ছে না, তবে নতুন ফ্ল্যাট বর্ণনটি।
ক্লাফু

উত্তর:


102

আইওএস 7 এর সাথে অ্যাপল নমুনা কোডটি প্রকাশ করেছে DateCell

এখানে চিত্র বর্ণনা লিখুন

টেবিল কোষগুলিতে তারিখের অবজেক্টগুলির বিন্যাসিত প্রদর্শন এবং সেই মানগুলি সম্পাদনা করতে ইউআইডিটপিকার ব্যবহার করে। এই টেবিলের প্রতিনিধি হিসাবে, নমুনাটি ইউআইডিটপিকার নিয়ন্ত্রণটি খুলতে "didSelectRowAtIndexPath" পদ্ধতিটি ব্যবহার করে।

আইওএস x.x এবং এর আগের জন্য, ইউআইভিউএনিমেশনটি ইউআইডিটিপিকারকে অন-স্ক্রিনে ও ডাউন-স্ক্রিন ডাউন স্লাইড করার জন্য ব্যবহৃত হয়। আইওএস x.x এর জন্য, ইউআইডিটপিকারটি টেবিল দৃশ্যে লাইনে যুক্ত করা হয়েছে।

ইউআইডিটপিকারের অ্যাকশন পদ্ধতিটি সরাসরি কাস্টম টেবিল ঘরের এনএসডিট সম্পত্তি সেট করবে। এছাড়াও, এই নমুনাটি দেখায় যে কীভাবে কাস্টম সেলের তারিখ-বিন্যাসিত উপস্থিতি অর্জন করতে এনএসডিট ফরমেটার ক্লাস ব্যবহার করা যায়।

এখানে চিত্র বর্ণনা লিখুন

আপনি এখানে নমুনা কোডটি ডাউনলোড করতে পারেন: ডেটসেল


অ্যাপলের কোডে সমস্যা আছে। আপনি যদি নিজের স্থির টেবিলটি রাখতে চান তবে নীচের আমার উত্তরটি দেখুন ভিউ
অ্যারন ব্র্যাচার

1
অ্যারনব্রেচার আমি আমার উত্তরে ডেটसेलকে পরিচয় করিয়ে দিই এবং আপনি চাইবেন না যে আপনি চাইবেন এমন সঠিক কোড পেয়েছেন। আপনার প্রয়োজন অনুসারে আপনাকে পরিবর্তন করতে হবে এবং পরিবর্তন করতে হবে। আপনার সমাধানটিও ভাল তবে মনে রাখবেন যে আপনার প্রয়োজনীয় কোডগুলি থেকে আপনি কখনই সঠিক হন না।
নিতিন গোহেল

3
সর্বাধিক ভয়ঙ্কর নমুনা কোড। কোড কমপ্লিট থেকে কখন কোন পদ্ধতি তৈরি করতে হবে সে সম্পর্কে তারা কিছু পরামর্শ দিয়ে করতে পেরেছিলেন
অনিরুধ আগাশে

2
বাহ অ্যাপল কোডটি .... ভাল, আসুন আমরা ফোকাসটি টেবিল ভিউ এফেক্টের দিকে রয়েছি। আমি আশা করি এই নমুনা প্রকল্পে কেউ তাদের কোড দ্বারা অনুপ্রাণিত হবে না: s
ড্যানিয়েল

84

আপনি উত্তর আমি আগে নিচের দিয়েছিলেন ব্যবহার করুন অথবা সুইফট আমি এই নতুন বর্গ ব্যবহার করতে পারেন এই কাজের একটি করতে প্রণীত অনেক সহজ এবং ক্লিনার: 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];
        }];
    }
}

যদি আমার একই টেবিলে একাধিক তারিখ / সময় বাছাইকারী থাকে তবে আমি ক্লিক অনুযায়ী পতাকাগুলি সেট করে যথাযথ সারিগুলি পুনরায় লোড করব। আমি খুঁজে পেয়েছি যে আমি আমার স্থিতিশীল টেবিল রাখতে পারি, অনেক কম কোড ব্যবহার করতে পারি এবং কী হচ্ছে তা বোঝা সহজ।


এটি আমার জন্য কাজ করেছিল, ইউআইটিবেল ভিউ-তে কোনও বাগ রয়েছে বলে মনে না করে। সারি উচ্চতা আমার পদ্ধতিতে সঠিকভাবে ফিরে আসছিল, তবে এটি আসলে আমি চেয়েছিলাম তার বিপরীত উচ্চতা টগল করে। আমি যদি দু'বার সারিগুলি পুনরায় লোড করি তবে এটি কাজ করে। (আমি টেবিলভিউ রিলোডলোড ডেটা ব্যবহার করিনি কারণ আমি পুরো জিনিসটি পুনরায় লোড করতে চাইনি)। এছাড়াও অ্যানিমেশন ব্লকটি প্রয়োজনীয় ছিল না, এটি নিজেরাই ঠিক জরিমানা দেখায়।
ক্রিস গ্যারেট

পাঠ্য পিকারটি তৈরি করতে কেউ কি নমুনাটি ব্যবহার করেছেন? যদি তাই হয়, কিভাবে? ধন্যবাদ
থিজিজার

1
আপনি বোঝাতে চেয়েছেন কোনও সারিটি প্রকাশ করা যাতে ব্যবহারকারী কোনও তারিখ নির্বাচনের পরিবর্তে পাঠ্য প্রবেশ করতে পারে? যদি তাই হয় তবে কোডটি একই। কেবল প্রকাশিত সারির বিষয়বস্তুই আলাদা।
অ্যারন ব্র্যাচার

22
সেখানে আমাদের iOS7.1 এর সাথে একটি বাগ রয়েছে যা ঘরের সীমা থেকে বাইরে অবজেক্টগুলি দেখায় - উচ্চতার সাথে 0 এবং অভ্যন্তরের চয়নকারী like সমাধানটি হ'ল সেলটির জন্য একটি আউটলেট পাবেন এবং সেল.clipsToBounds = YES সেট করুন;
এমিলডো

1
@ ডানকেন - উপরের আপ-ভোটিত মন্তব্যে একটি সমাধান বর্ণিত হয়েছে: স্ট্যাকওভারফ্লো / প্রশ্ন / 18973573/… সারিটির উচ্চতা শূন্য হলেও , বিষয়বস্তু ডিফল্টভাবে কাটা হয় না, তাই আপনি নীচের অংশে দেখতে পারেন নিম্নলিখিত সারি
ক্রিস নোলেট

18

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

@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];
}

এখানে কি আর কিছু নেই? কক্ষগুলির উচ্চতা পরিবর্তন হচ্ছে না :)
ডিভসি

2
আইওএস 7.1 যেহেতু আপনাকে অবশ্যই অ্যাট্রিবিউটস ইন্সপেক্টরটিতে "সাবভিউগুলিতে ক্লিপ" নির্বাচন করতে হবে - আমি যা অনুপস্থিত ছিল তা
হ'ল

এছাড়াও, "স্ব.ডেট ওপেন =! স্ব.আইসেটে ওপেন;" লাইনটি শুরুতে "self.isDateOpen =" পড়তে হবে, "self.dateOpen =" নয়
পিটার জনসন

2
[tableView reloadData];কল প্রয়োজন হয় না। বর্তমানে এটি সারি নির্বাচনটি অক্ষম করে, তবে এটির মতো সারিটি অনির্বাচিত করা ভাল:[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
ব্যারি হ্যানস্ট্র্রা

আমার কাছে অদ্ভুত অ্যানিমেশন প্রভাব ছিল যেমন "খোলার" পরে তারিখের ঘরটি ফাঁকা হবে তবে প্রারম্ভিক এবং শেষগুলি ব্যবহার করে এটি সমাধান হয়েছে। এখন সুন্দর এবং মসৃণ। ধন্যবাদ দ্যাটিন!
nh32rg

5

আমি অ্যাপল থেকে ডেটসেল উত্সটি নিয়েছি এবং স্টোরিবোর্ড ফাইলটি সরিয়েছি।

আপনি যদি স্টোরিবোর্ড ছাড়াই চান তবে একবার দেখুন: https://github.com/ajaygautam/DateCellWithoutStoryboard


ধন্যবাদ @Ajay, আমি আপনার সংশোধিত কোড ব্যবহার করা হয় এবং প্রতিস্থাপন করতে চান UIDatePickerসঙ্গে UIPickerView। আমি কয়েকটি জিনিস চেষ্টা করেছিলাম এবং pickerViewপ্রতিটি ঘরে প্রদর্শিত করতে সক্ষম হয়েছি তবে এটি প্রতিটি কক্ষের সাথে আপডেট হয় না। আমি আমার প্রশ্ন এবং কোড এখানে পোস্ট করেছি । দয়া করে একবার দেখুন এবং যদি আপনি আমাকে সমাধানের পরামর্শ দিতে পারেন তবে এটি খুব দয়াবান হবে।
মুগেস মুসাদ্দিক

আমি আপনার প্রশ্নটি দেখেছি ... এটিতে খুব বেশি তথ্য রয়েছে এবং সত্যিকার অর্থে খুব বেশি ব্যাখ্যা করা যায় না। আমার চেহারা দেখার জন্য আপনি কোথাও আপনার কোডটি আপ / জিপড আপলোড করতে পারেন। আমি এটি ডিবাগ করতে পারি - যদি আমি কোডটি চালাতে পারি ...
অজয় গৌতম

ধন্যবাদ, আমি একরকম প্রতিস্থাপন করতে পরিচালিত UIDatePickerসঙ্গে UIPickerViewকিন্তু বাগ কয়েক সঙ্গে। 1. আপনি যখন UIPickerViewটেবিলটি খুলুন এবং স্ক্রোল করবেন তখন এটি ক্রাশ হয় । ২. UILabelমানগুলি শীর্ষ সারিগুলিতে বিশদ বিবরণে নির্ধারিত হওয়ার পরে এটি স্বয়ংক্রিয়ভাবে সারণীর নীচের সারিগুলিতে বিশদকে মান নির্ধারণ করে । এখানে আমার কোডটি রয়েছে
মুঘি মুসাদ্দিক

আপনি কি পরীক্ষার প্রজেক্ট, কোনও ভাগ্য খুঁজে পেতে সক্ষম?
মুঘি মুসাদ্দিক

দুঃখিত, আমি কিছুটা ব্যস্ত হয়ে পড়েছি। এখনও এই সাহায্য প্রয়োজন?
অজয় গৌতম

5

এটি সম্পর্কে সেরা টিউটোরিয়ালগুলির মধ্যে একটি হ'ল আইওএস 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);
}

2
আপনি যদি ডাউনটিভোট করেন তবে আপনি কেন ডাউন ডাউন করেছেন তা সম্ভবত আপনি ব্যাখ্যা করতে পারবেন। সাইটের লিঙ্কগুলি পোস্ট করার পরিবর্তে আমি কিছু কোডও অন্তর্ভুক্ত করেছি। আমার ক্ষেত্রে এটি সি # জানি না যে এতে কী হয়েছে?
পরীক্ষার

3

টেবিলভিউতে একটি ইনলাইন চয়নকারী ইনলাইন যুক্ত করার প্রক্রিয়াটিকে সহজ করার জন্য আমি আমার নিজস্ব কাস্টম ভিউ নিয়ামক তৈরি করেছি। আপনি কেবল এটি সাবক্লাস করেন এবং কিছু সাধারণ নিয়ম অনুসরণ করেন এবং এটি তারিখ চয়নকারী উপস্থাপনা পরিচালনা করে।

আপনি এখানে এটি একটি উদাহরণ প্রকল্পের সাথে এটি সন্ধান করতে পারেন যা এটি কীভাবে ব্যবহার করতে হয় তা বোঝায় : https://github.com/ale84/ALEInlineDatePickerViewController


3

আমি অ্যাপলের ডেটसेल উদাহরণের একটি ত্রুটির উত্তর পেয়েছি যেখানে আপনার অবশ্যই শেষ ডেটসেলের নীচে সারি থাকতে হবে বা আপনি একটি ত্রুটি পেয়েছেন। সেলফোর্ডআউটইন্ডেক্সপথ পদ্ধতিতে আইটেমডেটা লাইনটি প্রতিস্থাপন করুন

NSArray *itemsArray = [self.dataArray objectAtIndex:indexPath.section];
NSDictionary *itemData = nil;

if(![indexPath isEqual:self.datePickerIndexPath])
    itemData = [itemsArray objectAtIndex:modelRow];

নমুনা কোডটি প্রতিস্থাপনের পরে আমি এখন ডেটপিকার সেলটি তার নীচে কোনও সেল ছাড়াই প্রদর্শন করতে পারি।

আমি সবেমাত্র স্ট্যাকওভারফ্লোতে যোগ দিয়েছি তাই যদি এটি ভুল জায়গায় হয় বা অন্য কোথাও হয় তবে আমি ক্ষমা চাই।


3

অ্যারন ব্র্যাচারের উত্তর একাধিক বিভাগের সাথে ব্যবহার না করা ব্যতীত কাজ করেছিল। অ্যানিমেশনগুলি কিছুটা চপি ছিল এবং এটি পরবর্তী বিভাগগুলি খুব ভালভাবে স্লাইড করে না। এটি ঠিক করার জন্য আমি বিভাগের পরবর্তী সেটটি দিয়ে পুনরাবৃত্তি করেছি এবং তারিখ চয়নকারীর উচ্চতার সমান পরিমাণে সারিগুলিকে অনুবাদ করেছি।

আমি 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];
    }];
}

টিম্মাহঃ ধন্যবাদ, আমি বিভাগ অ্যানিমেশন চপ্পিটিও পেয়েছি। আমি আপনার প্রথম সমাধানটি সফলভাবে ব্যবহার করেছি! আমি দেখতে পেলাম যে সেলফোরআরআউটআইডেক্সপথটি শূন্য করে যেখানে ঘরগুলি বাইরে পর্দার বাইরে রয়েছে। এটি এড়াতে আমি আমার সমস্ত কোষ সমন্বিত একটি আইবি আউটলেট-সংকলন যুক্ত করেছি, এটি পিকার সেলের পরে এসেছিল এবং আপনার নতুন y_coord এর মাধ্যমে সেগুলি পুনরুক্ত করে। এটিকে জটিল বলে মনে হচ্ছে যদিও নতুন কক্ষ যুক্ত করার সময় আমাকে সংগ্রহটি আপ টু ডেট রাখতে হবে।
জোশ

তুমি ঠিক বলছো. আসলে, আমি সমস্যাটি স্থির করেছিলাম কিন্তু স্ট্যাক ওভারফ্লো আমাকে আমার যে কোডটি রেখেছিল তা সম্পাদনা করতে দেয় না।
টিমোথি লোগান

3

পূর্ববর্তী উত্তরগুলি যুক্ত করা,

আমি @ ড্যাটিনক এবং @ অ্যারন ব্র্যাচার সমাধান উভয়ই চেষ্টা করেছিলাম, উভয়ই দুর্দান্ত কাজ করেছে তবে অ্যানিমেশনটি একটি দলবদ্ধ স্ট্যাটিক টেবিল ভিউতে এত পরিষ্কার ছিল না।

এটির সাথে কিছুটা খেলার পরে আমি এই কোডটি পেয়েছিলাম যা আমার পক্ষে পরিষ্কার এবং দুর্দান্ত কাজ করে -

- (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.2-এ আমার প্রয়োজনীয় ফলাফল পেয়েছে। আবার আপনাকে ধন্যবাদ!
টেরেন্স শ

2

পূর্ববর্তী উত্তরগুলি এবং @ অ্যারন ব্র্যাচার সমাধানগুলিতে যুক্ত করা হচ্ছে ...

আমি আইওএস 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;
    }
}

1

অ্যানিমেশন ব্যতীত এই উত্তরটি ব্যবহার করা আইওএস 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()
    }
}

1

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

বিটিডব্লু আপনার ইচ্ছায় আপনার টেবিলে যতগুলি ডেট পিকার থাকতে পারে!

একটি ইউআইটিএবল ভিউসেল সাবক্লাস তৈরি করুন :

আপনার সমস্ত টেবিল দেখার ঘরগুলি এই শ্রেণি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হতে হবে এবং আপনার অবশ্যই প্রতিটি সারির জন্য ঘরের উচ্চতা ম্যানুয়ালি সেট করতে হবে।

//
//  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

0

সুইফট সংস্করণে ডেটসেল ব্যবহারের সবচেয়ে সহজ উপায়: এই উদাহরণটি ব্যবহার করুন ।

  1. এই উদাহরণটি খুলুন এবং এটি পরীক্ষা করুন (এক্সকোডটি রূপান্তর করতে সুইফট 2 তে রূপান্তর করুন)
  2. আপনার প্রকল্পে " তারিখসেলট্যাবলভিউকন্ট্রোলআর সুইফ্ট " শ্রেণি টানুন ।

  3. "মেইন.স্টরিবোর্ড" খুলুন এবং " স্টেটকেল " ভিউকন্ট্রোলার অবজেক্টটি অনুলিপি করুন এবং এটি আপনার স্টোরিবোর্ডে রেখে দিন।

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