অ্যাকশন শীটে ইউআইপিকারকার ভিউ এবং একটি বোতাম যুক্ত করুন - কীভাবে?


120

আমার অ্যাপ্লিকেশনটির জন্য ক্রিয়াকলাপে নিম্নলিখিত জিনিসগুলি যুক্ত করা দরকার।

  • UIToolbar
  • ইউআইটিুলবারে বোতাম
  • UIPicker নিয়ন্ত্রণ

আমার প্রয়োজনীয়তা বুঝতে আমি একটি চিত্র অন্তর্ভুক্ত করেছি।

বিকল্প পাঠ

আপনি দয়া করে ব্যাখ্যা করতে পারেন, এটি কীভাবে বাস্তবায়ন করা যায়?


3
এই আকর্ষণীয় সমস্যা পোস্ট করার জন্য আপনাকে ধন্যবাদ!
Tuyen Nguyen

অ্যাকশনশিট, পিকরভিউ, ইত্যাদি পরিচালনার সাথে জড়িত হওয়ার পরিবর্তে, আমি EAActionSheetPicker ব্যবহার করার পরামর্শ দেব । এটি সত্যিই আপনার কোডটিকে অনেক পরিষ্কার করে দেয়।
ইবার্ডারসন

@ সেকিজেরো দুর্ভাগ্যক্রমে, EAActionSheetPicker আইওএস 7 এ বিভক্ত বলে মনে হচ্ছে, "অবৈধ প্রসঙ্গ 0x0" দিয়ে শুরু করে অনেক ত্রুটি রয়েছে।
ম্যাগনাস

অবশ্যই এটি সত্য হওয়া ভাল ... আমাকে ফাঁকি দিয়েছিলেন, yos ios b এত কঠিন
চককেলি

EAActionSheetPicker আর কাজ করে না।
osxdirk

উত্তর:


25

আইওএস 7 এর জন্য আপডেট

ইউআইএક્શનশীটের জন্য অ্যাপল ডক্স :UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy

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

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

  1. একটি নতুন ইউআইটিএবলভিউ কনট্রোলার সাবক্লাস তৈরি করুন SimpleTableViewController
  2. আপনার স্টোরিবোর্ডে একটি ইউআইটিএবলভিউ কনট্রোলার তৈরি করুন (একটি নেভিগেশন কন্ট্রোলারে এমবেড করা) এবং এর কাস্টম ক্লাসটি সিম্পেটেবল ভিউকন্ট্রোলারে সেট করুন।
  3. সিম্পল টেবিলভিউ কনট্রোলারের জন্য "সিম্পলটেবলভিসি" এর একটি স্টোরিবোর্ড আইডি নেভিগেশন নিয়ামককে দিন।
  4. সিম্পল টেবিলভিউকন্ট্রোল.আরহ, একটি এনএসআরাই সম্পত্তি তৈরি করুন যা টেবিলের ডেটা উপস্থাপন করবে।
  5. সিম্পিটেবলভিউকন্ট্রোলআর.এই, SimpleTableViewControllerDelegateএকটি প্রয়োজনীয় পদ্ধতি সহ একটি প্রোটোকল itemSelectedatRow:এবং টাইপের প্রতিনিধি নামে একটি দুর্বল সম্পত্তি তৈরি করুন id<SimpleTableViewControllerDelegate>। এইভাবে আমরা নির্বাচনটি প্যারেন্ট কন্ট্রোলারের কাছে ফিরিয়ে দেব।
  6. SimpleTableViewController.m সালে tableview তথ্য উৎস বাস্তবায়ন ও পদ্ধতি প্রতিনিধি, কলিং itemSelectedatRow:মধ্যে tableView:didSelectRowAtIndexPath:

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

UINavigationController *navigationController = (UINavigationController *)[self.storyboard instantiateViewControllerWithIdentifier:@"SimpleTableVC"];
SimpleTableViewController *tableViewController = (SimpleTableViewController *)[[navigationController viewControllers] objectAtIndex:0];
tableViewController.tableData = self.statesArray;
tableViewController.navigationItem.title = @"States";
tableViewController.delegate = self;
[self presentViewController:navigationController animated:YES completion:nil];

আমি একটি সাধারণ উদাহরণ তৈরি করেছি এবং এটি গিথুবে পোস্ট করেছি

এছাড়াও দেখুন ক্রিয়াকলাপটি দেখানো সিজিকনটেক্সটকে অবৈধ প্রসঙ্গ ত্রুটির কারণ করে


2
আহঃ আইওএস 7! এখন অবধি যা কিছু বিকশিত হয়েছিল তুমি তা ধ্বংস করে দিয়েছ। :(
সাগর আর কোঠারি

@ কাইল আপনার দৃষ্টিভঙ্গিটি কী তা জানিয়ে আপনার উত্তরটি প্রসারিত করতে পারবেন? ধন্যবাদ
ড্যানিয়েল সানচেজ

1
@ ড্যানিয়েলসানচেজ বিকল্প পরামর্শ এবং কোড নমুনা সহ আপডেট হয়েছে।
কাইল Clegg

3
আরও অনেক মার্জিত সমাধান আইএমএইচও হ'ল আপনার পাঠ্যক্ষেত্রের ইনপুট ভিউটি ইউআইপিকারকার ভিউতে সেট করুন এবং এর ইউটিআইটিবুলিতে আনুষাঙ্গিক। উদাহরণস্বরূপ আপনি কুইকডায়ালগ প্রকল্পটি পরীক্ষা করে দেখতে পারেন।
স্টিভ মোসার

111

আরও একটি সমাধান:

  • কোনও সরঞ্জামদণ্ড ছাড়া একটি বিভাগযুক্ত নিয়ন্ত্রণ (আইক্যান্ডি) নেই

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil 
                                                        delegate:nil
                                                        cancelButtonTitle:nil
                                                        destructiveButtonTitle:nil
                                                        otherButtonTitles:nil];
    
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    
    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
    
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    
    [actionSheet addSubview:pickerView];
    [pickerView release];
    
    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Close"]];
    closeButton.momentary = YES; 
    closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor blackColor];
    [closeButton addTarget:self action:@selector(dismissActionSheet:) forControlEvents:UIControlEventValueChanged];
    [actionSheet addSubview:closeButton];
    [closeButton release];
    
    [actionSheet showInView:[[UIApplication sharedApplication] keyWindow]];
    
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
    

1
আমি ইউআইএ অ্যাপ্লিকেশন পাচ্ছি মেইন উইন্ডো সতর্কতা এবং অ্যাপ্লিকেশন সমাপ্তির প্রতিক্রিয়া নাও পারে।
মহেশ বাবু

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

1
আসলে ফ্রেড্রিক, আপনার [[ইউআইএএপ্লিকেশন শেয়ারড অ্যাপ্লিকেশন] কী উইন্ডো] ব্যবহার করা উচিত। এটি পরিবর্তন করতে উত্স সম্পাদিত।
এরিক গোল্ডবার্গ

3
ভ্যান ডু ট্রান - (অকার্যকর) বরখাস্তঅ্যাকশনশিট: (ইউআইএসজিটেডকন্ট্রোল *) প্রেরক {ইউআইএএকশনশীট অ্যাকশনশিট = (ইউআইএএকশনশিট ) [প্রেরক তদারকি]; [অ্যাকশনশিট বরখাস্ত উইথ ক্লিকডবটন ইন্ডেক্স: 0 অ্যানিমেটেড: হ্যাঁ]; }
WINSergey

1
শিরোনাম: এটি আইওএস-এ অনেকগুলি সিজি কনটেক্সট ত্রুটি ঘটায় st. স্ট্যাকওভারফ্লো / প্রশ্নগুলি দেখুন / ১৯২৯৯৯৯/২
কাইল ক্লেগ

75

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

সম্পাদনা করুন: এটি এখন একটি ডেটপিকার এবং দূরত্বপিকার ব্যবহারকে সমর্থন করে।


UPD:

এই সংস্করণটি অবচিত করা হয়েছে: এর পরিবর্তে অ্যাকশনশিটপিকার -৩০ ব্যবহার করুন।

অ্যানিমেশন


1
সুপার ... এটি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করে।
মাইকেল মরিসন

অসাধারণ. এখন এটি ব্যবহার করে।
জেমস স্কিডমোর

@ আপনি যদি আপনার কোড ব্যবহার করি তবে আমার প্রকল্পে আপনার নাম যুক্ত করার দরকার আছে, ধন্যবাদ
ভিনথপ

হ্যালো, আমি এই অ্যাপ্লিকেশনটিতে এই শ্রেণিটি ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করে। ধন্যবাদ। আমার একটা প্রশ্ন আছে. ইন ActionSheetDatePickerমোডে, উপরে টুলবারে একাধিক বোতাম জুড়তে পারেন। এটি কি কেবল সাধারণের সাথেই সম্ভব ActionSheetStringPicker?
ইসুরু

এটি একাধিক নির্বাচন করতে পারে?
কাইল Clegg

32

হ্যাঁ! আমি অবশেষে এটি খুঁজে।

প্রশ্নের ইমেজ হিসাবে দেওয়া অ্যাকশনশিট পপ আপ করতে আপনার বোতাম ক্লিক ইভেন্টে নিম্নলিখিত কোডটি প্রয়োগ করুন।

UIActionSheet *aac = [[UIActionSheet alloc] initWithTitle:@"How many?"
                                             delegate:self
                                    cancelButtonTitle:nil
                               destructiveButtonTitle:nil
                                    otherButtonTitles:nil];

UIDatePicker *theDatePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 44.0, 0.0, 0.0)];
if(IsDateSelected==YES)
{
    theDatePicker.datePickerMode = UIDatePickerModeDate;
    theDatePicker.maximumDate=[NSDate date];
}else {
    theDatePicker.datePickerMode = UIDatePickerModeTime;
}

self.dtpicker = theDatePicker;
[theDatePicker release];
[dtpicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];

pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerDateToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerDateToolbar sizeToFit];

NSMutableArray *barItems = [[NSMutableArray alloc] init];

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[barItems addObject:flexSpace];

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(DatePickerDoneClick)];
[barItems addObject:doneBtn];

[pickerDateToolbar setItems:barItems animated:YES];

[aac addSubview:pickerDateToolbar];
[aac addSubview:dtpicker];
[aac showInView:self.view];
[aac setBounds:CGRectMake(0,0,320, 464)];

হাই সাগর, কোডটির জন্য ধন্যবাদ, ডেটপিকারডোনক্লিক বোতাম ইভেন্ট, কীভাবে ধন্যবাদ জানাতে হবে
অ্যাপাচি

সাগর, কীভাবে পপ আপ অ্যাকশনশিটটি বরখাস্ত করা যায় এবং পাঠ্যক্ষেত্রে নির্বাচিত মান যুক্ত করা যায় ধন্যবাদ
অ্যাপাচি

[aac dimisswithclickedindex] // এই পদ্ধতির মতো। (দেখুন আমি কর্ম পত্রকে একটি সম্পন্ন বোতাম রেখেছি & সম্পন্ন বোতাম লক্ষ্য যুক্ত করুন - নির্বাচক ও নির্বাচক জায়গা dimissal কোডে।
সাগর আর কোঠারি

সাগর জবাব দেওয়ার জন্য ধন্যবাদ, আমি [এএসি বরখাস্ত উইথ ক্লিকড বাটন ইন্ডেক্স] যুক্ত করি; তবে আমি সতর্কতা পাচ্ছি: 'ইউআইএক্সেশনশীট' '-ডিজম উইথ ক্লিকড বাটন ইন্ডেক্স'-এর প্রতিক্রিয়া জানাতে পারে না তারপরে আমি নির্বাচক' ডেটপিকারডোনক্লিক'-এর জন্য নীচের মতো নতুন পদ্ধতি তৈরি করি - (শূন্য) ডেটপিকারডোনক্লিক S এনএসএলজি (@ "ক্লিক হয়ে গেছে"); ratings.text = পিকরভিউ অবজেক্টএটিআইডেক্স: সারি]} আমি কী করব তাই যখন আমি সম্পন্ন বোতামটি ক্লিক করি তখন ইউআইএএকশনশিট (এএসি) বরখাস্ত করুন এবং পাঠ্যক্ষেত্র (রেটিং.টেক্সট) বাছাই করা ধন্যবাদ সাগর থেকে নির্বাচিত মান দিয়ে পূর্ণ হবে
এপাচি

1
@ স্পার্কে পিকারের পাঠ্য সম্পর্কে কিছু ধারণা দেওয়া সম্ভব .. আপনার পোস্টের জন্য ধন্যবাদ + 1
বিনথপ

10

এই প্রশ্নের মার্সিওর দুর্দান্ত সমাধানটি কোনও ইউআইএક્શનশীটটিতে যে কোনও ধরণের সংক্ষিপ্তসারগুলি যুক্ত করতে আমার পক্ষে খুব সহায়ক হয়েছিল।

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

যাইহোক, শীটটি প্রদর্শিত হওয়ার পরে ইউআইএএকশনশিটের সীমানা নির্ধারণ করা যখন অ্যাকশনশিটটি উপস্থিত হয়, সেখানে এটি "পপ" হয় এবং তারপরে কেবল চূড়ান্ত 40 পিক্সেল বা তারও বেশি স্ক্রোল থাকে a

সাবউভিউগুলি যুক্ত করার পরে কোনও ইউআইপিকারকার ভিউয়ের আকার দেওয়ার সময়, আমি অ্যানিমেশন ব্লকের ভিতরে অ্যাকশনশিটে প্রেরিত সেটবাউন্ডস বার্তাটি মোড়ানোর পরামর্শ দিই। এটি অ্যাকশনশিটের প্রবেশদ্বারকে মসৃণ করে তুলবে।

UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];


// add one or more subviews to the UIActionSheet
// this could be a UIPickerView, or UISegmentedControl buttons, or any other 
// UIView.  Here, let's just assume it's already set up and is called 
// (UIView *)mySubView
[actionSheet addSubview:myView];

// show the actionSheet
[actionSheet showInView:[UIApplication mainWindow]];


// Size the actionSheet with smooth animation
    [UIView beginAnimations:nil context:nil];
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
    [UIView commitAnimations]; 

6
এটি একটি মহান টিপ। আইওএস 4 এর অধীনে এবং তারপরে, ডক্স অনুসারে এই অ্যানিমেশনের স্টাইলটি "নিরুৎসাহিত"। আইওএস 4 বা তারপরে, এর পরিবর্তে এটি ব্যবহার করে দেখুন: ইউআইভিউ অ্যানিমেটওয়্যারডিউরেশনকালীন: 0.3f দেরি: 0 টি বিকল্প: ইউআইভিউএনিমেশনঅপশন কার্কভইজআইইনআউট অ্যানিমেশন: ^ {[অ্যাকশনশিট সেটবাউন্ডস: সিজিআরেক্টমেক (0,0,320,485)];} সমাপ্তি: NULL];
ceperry

9

যারা ছেলেরা ডেটপিকারডোনক্লিক ফাংশনটি সন্ধান করার জন্য চেষ্টা করছেন ... তাদের অ্যাকশনশিটটি খারিজ করার সহজ কোড এখানে। স্পষ্টতই আ্যাক একটি আইভার হওয়া উচিত (যেটি আপনার প্ররোচনায় থাকে


- (void)DatePickerDoneClick:(id)sender{
    [aac dismissWithClickedButtonIndex:0 animated:YES];
}

9

আমি বুঝি না কেন UIPickerViewএকটি ভিতরে যাচ্ছে UIActionSheet। এটি একটি অগোছালো এবং হ্যাকি সমাধান বলে মনে হচ্ছে, যা ভবিষ্যতের আইওএস রিলিজে ভেঙে যেতে পারে। (এর আগে আমি একটি অ্যাপ্লিকেশনটিতে এই বিরতির মতো জিনিস পেয়েছি, যেখানে UIPickerViewপ্রথম ট্যাপে উপস্থাপন করা হচ্ছে না এবং পুনরায় প্রয়োগ করতে হয়েছিল - দ্য বিস্ময়কর কৌতুক UIActionSheet)।

আমি যা করেছি তা হ'ল একটি বাস্তবায়ন করা UIPickerViewএবং তারপরে এটিকে আমার দৃষ্টিতে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করা, এবং এটিকে এমনভাবে চালিত করা যেন এটি কোনও অ্যাকশনশিটের মতো উপস্থাপিত হচ্ছে।

/// Add the PickerView as a private variable
@interface EMYourClassName ()

@property (nonatomic, strong) UIPickerView *picker;
@property (nonatomic, strong) UIButton *backgroundTapButton;

@end

///
/// This is your action which will present the picker view
///
- (IBAction)showPickerView:(id)sender {

    // Uses the default UIPickerView frame.
    self.picker = [[UIPickerView alloc] initWithFrame:CGRectZero];

    // Place the Pickerview off the bottom of the screen, in the middle set the datasource delegate and indicator
    _picker.center = CGPointMake([[UIScreen mainScreen] bounds].size.width / 2.0, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
    _picker.dataSource = self;
    _picker.delegate = self;
    _picker.showsSelectionIndicator = YES;

    // Create the toolbar and place it at -44, so it rests "above" the pickerview.
    // Borrowed from @Spark, thanks!
    UIToolbar *pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, -44, 320, 44)];
    pickerDateToolbar.barStyle = UIBarStyleBlackTranslucent;
    [pickerDateToolbar sizeToFit];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];

    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];

    // The action can whatever you want, but it should dimiss the picker.
    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
    [barItems addObject:doneBtn];

    [pickerDateToolbar setItems:barItems animated:YES];
    [_picker addSubview:pickerDateToolbar];

    // If you have a UITabBarController, you should add the picker as a subview of it
    // so it appears to go over the tabbar, not under it. Otherwise you can add it to 
    // self.view
    [self.tabBarController.view addSubview:_picker];

    // Animate it moving up
    [UIView animateWithDuration:.3 animations:^{
        [_picker setCenter:CGPointMake(160, [[UIScreen mainScreen] bounds].size.height - 148)]; //148 seems to put it in place just right.
    } completion:^(BOOL finished) {
        // When done, place an invisible button on the view behind the picker, so if the
        // user "taps to dismiss" the picker, it will go away. Good user experience!
        self.backgroundTapButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _backgroundTapButton.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
        [_backgroundTapButton addTarget:self action:@selector(backgroundTapped:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:_backgroundTapButton];
    }];

}

// And lastly, the method to hide the picker.  You should handle the picker changing
// in a method with UIControlEventValueChanged on the pickerview.
- (void)backgroundTapped:(id)sender {

    [UIView animateWithDuration:.3 animations:^{
        _picker.center = CGPointMake(160, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
    } completion:^(BOOL finished) {
        [_picker removeFromSuperview];
        self.picker = nil;
        [self.backgroundTapButton removeFromSuperview];
        self.backgroundTapButton = nil;
    }];
}

এটি দুর্দান্ত ধন্যবাদ। আপনি iOS 7 এর সাথে এই কাজটি ভাল করে দেখতে পেয়েছেন?
অভ্যাস

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

7

মার্সিওর দুর্দান্ত সমাধানটিতে যোগ করতে, dismissActionSheet:নিম্নলিখিত হিসাবে প্রয়োগ করা যেতে পারে।

  1. আপনার .h ফাইলে একটি অ্যাকশনশিট অবজেক্ট যুক্ত করুন, এটি সংশ্লেষ করুন এবং এটি আপনার .m ফাইলে রেফারেন্স করুন।
  2. আপনার কোডে এই পদ্ধতিটি যুক্ত করুন।

    - (void)dismissActionSheet:(id)sender{
      [_actionSheet dismissWithClickedButtonIndex:0 animated:YES];
      [_myButton setTitle:@"new title"]; //set to selected text if wanted
    }

3

আমি মনে করি এটি এটি করার সেরা উপায়।

ActionSheetPicker -3.0

এটি বেশ কিছু যা পরামর্শ দেয় তবে ব্লক ব্যবহার করে, যা একটি দুর্দান্ত স্পর্শ!


ভাল আপনি যদি উপরে পড়েন তবে দেখবেন এই থ্রেডের কারণে এই অ্যাকশনশিটপিকার শ্রেণিটি প্রথম স্থানে এসেছিল। হ্যাঁ এটিই সেরা উপায়, গৃহীত সমাধানটির জন্য ধন্যবাদ (¬_¬)। stackoverflow.com/questions/1262574/...
OpenUserX03

2
দেখে মনে হচ্ছে আপেল তাদের নিয়মটি প্রয়োগ করতে শুরু করেছে যে আমি এই ত্রুটি বার্তা পাচ্ছি বলে অ্যাকশনশিটগুলি সাবক্ল্যাস করা উচিত নয় - "<ত্রুটি>: সিজি কনটেক্সটসেটফিলকলার উইথ কালার: অবৈধ প্রসঙ্গ 0x0। এটি একটি গুরুতর ত্রুটি This এই অ্যাপ্লিকেশন, বা এটি ব্যবহার করে এমন একটি লাইব্রেরি , একটি অবৈধ প্রসঙ্গ ব্যবহার করছে এবং এর ফলে সিস্টেমের স্থিতিশীলতা এবং নির্ভরযোগ্যতার সামগ্রিক অবনতিতে অবদান রাখছে This এই বিজ্ঞপ্তিটি সৌজন্যে: দয়া করে এই সমস্যাটি ঠিক করুন an
স্টুয়ার্ট পি।

@StuartP। আমার উত্তর দেখুন
কাইল Clegg

2

আইওএস 8 এর পরে, আপনি পারবেন না, এটি কাজ করে না কারণ অ্যাপল অভ্যন্তরীণ বাস্তবায়নটির পরিবর্তন করেছে UIActionSheet। পড়ুন দয়া করে অ্যাপল ডকুমেন্টেশন :

সাবক্লাসিং নোটস

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


1

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

#define DURATION            0.4
#define PICKERHEIGHT        162.0
#define TOOLBARHEIGHT       44.0

@interface ViewController ()
@property (nonatomic, strong) UIView        *popup;
@property (nonatomic, strong) UIPickerView  *picker;
@property (nonatomic, strong) UIToolbar     *pickerToolbar;
@property (nonatomic, strong) UIButton      *backgroundTapButton;
@end

-(void)viewDidLoad {
    // These are ivars for convenience
    rect = self.view.bounds;
    topNavHeight = self.navigationController.navigationBar.frame.size.height;
    bottomNavHeight = self.navigationController.toolbar.frame.size.height;
    navHeights = topNavHeight + bottomNavHeight;
}

-(void)showPickerView:(id)sender {
    [self createPicker];
    [self createToolbar];

    // create view container
    _popup = [[UIView alloc] initWithFrame:CGRectMake(0.0, topNavHeight, rect.size.width, rect.size.height - navHeights)];
    // Initially put the centre off the bottom of the screen
    _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    [_popup addSubview:_picker];
    [_popup insertSubview:_pickerToolbar aboveSubview:_picker];

    // Animate it moving up
    // This seems to work though I am not sure why I need to take off the topNavHeight
    CGFloat vertCentre = (_popup.frame.size.height - topNavHeight) / 2.0;

    [UIView animateWithDuration:DURATION animations:^{
        // move it to a new point in the middle of the screen
        [_popup setCenter:CGPointMake(rect.size.width / 2.0, vertCentre)];
    } completion:^(BOOL finished) {
        // When done, place an invisible 'button' on the view behind the picker,
        // so if the user "taps to dismiss" the picker, it will go away
        self.backgroundTapButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _backgroundTapButton.frame = CGRectMake(0, 0, _popup.frame.size.width, _popup.frame.size.height);
        [_backgroundTapButton addTarget:self action:@selector(doneAction:) forControlEvents:UIControlEventTouchUpInside];
        [_popup insertSubview:_backgroundTapButton belowSubview:_picker];
        [self.view addSubview:_popup];
    }];
}

-(void)createPicker {
    // To use the default UIPickerView frame of 216px set frame to CGRectZero, but we want the 162px height one
    CGFloat     pickerStartY = rect.size.height - navHeights - PICKERHEIGHT;
    self.picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, pickerStartY, rect.size.width, PICKERHEIGHT)];
    _picker.dataSource = self;
    _picker.delegate = self;
    _picker.showsSelectionIndicator = YES;
    // Otherwise you can see the view underneath the picker
    _picker.backgroundColor = [UIColor whiteColor];
    _picker.alpha = 1.0f;
}

-(void)createToolbar {
    CGFloat     toolbarStartY = rect.size.height - navHeights - PICKERHEIGHT - TOOLBARHEIGHT;
    _pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, toolbarStartY, rect.size.width, TOOLBARHEIGHT)];
    [_pickerToolbar sizeToFit];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelAction:)];
    [barItems addObject:cancelButton];

    // Flexible space to make the done button go on the right
    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];

    // The done button
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)];
    [barItems addObject:doneButton];
    [_pickerToolbar setItems:barItems animated:YES];
}

// The method to process the picker, if we have hit done button
- (void)doneAction:(id)sender {
    [UIView animateWithDuration:DURATION animations:^{
        _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    } completion:^(BOOL finished) { [self destroyPopup]; }];
    // Do something to process the returned value from your picker
}

// The method to process the picker, if we have hit cancel button
- (void)cancelAction:(id)sender {
    [UIView animateWithDuration:DURATION animations:^{
        _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    } completion:^(BOOL finished) { [self destroyPopup]; }];
}

-(void)destroyPopup {
    [_picker removeFromSuperview];
    self.picker = nil;
    [_pickerToolbar removeFromSuperview];
    self.pickerToolbar = nil;
    [self.backgroundTapButton removeFromSuperview];
    self.backgroundTapButton = nil;
    [_popup removeFromSuperview];
    self.popup = nil;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.