আনউইন্ড সেগগুলি কী কী এবং আপনি সেগুলি কীভাবে ব্যবহার করবেন?


584

আইওএস 6 এবং এক্সকোড 4.5 এর একটি নতুন বৈশিষ্ট্য রয়েছে যা "আনওয়াইন্ড সেগু" হিসাবে উল্লেখ করা হয়েছে:

আনওয়াইন্ড সেগগুলি স্টোরিবোর্ডে দৃশ্যের বিদ্যমান দৃষ্টান্তগুলিতে রূপান্তর করতে পারে

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

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

আনইন্ডাইন্ড সেগুগুলি কীভাবে কাজ করে এবং সেগুলির জন্য কী ব্যবহার করা যায়?

উত্তর:


1267

সংক্ষেপে

একটি অনিচ্ছাকৃত অংশ (কখনও কখনও বলা হয়) প্রস্থান segue ) ধাক্কা, মোডাল বা popover segues চলাচল ফিরে ব্যবহার করা যেতে পারে (যেন আপনি ন্যাভিগেশন বার থেকে গৌণ আইটেমটি popped, popover বন্ধ বা modally উপস্থাপন দৃশ্য নিয়ামক বরখাস্ত)। তার উপরে আপনি কেবলমাত্র একটি নয়, তবে ধাক্কা / মডেল / পপওভার সেগগুলির একটি ধারাবাহিকভাবে উদ্বোধন করতে পারেন, উদাহরণস্বরূপ, আপনার নেভিগেশন শ্রেণিবদ্ধের একাধিক পদক্ষেপ "পিছনে ফিরে যান" একক আনইন্ডাইন্ড ক্রিয়া সহ।

আপনি যখন আনইন্ডাইন্ড সিগ সম্পাদন করেন, আপনাকে একটি ক্রিয়া নির্দিষ্ট করতে হবে যা আপনি যে দৃশ্যটি নিয়ন্ত্রণে আনতে চান সেটি নিয়ন্ত্রকের একটি ক্রিয়া পদ্ধতি।

উদ্দেশ্য গ:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

সুইফট:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

আপনি যখন স্টোরিবোর্ডে আনওয়াইন্ড সেগুটি তৈরি করবেন তখন এই অ্যাকশন পদ্ধতির নামটি ব্যবহৃত হয়। তদ্ব্যতীত, এই পদ্ধতিটি অযাচিত সেগ সম্পাদনের ঠিক আগে ডাকা হয়। UIStoryboardSegueসেগটি শুরু করা ভিউ কন্ট্রোলারের সাথে ইন্টারঅ্যাক্ট করার জন্য আপনি উত্স প্যারামিটার থেকে উত্স ভিউ কন্ট্রোলার পেতে পারেন (যেমন মডেল ভিউ কন্ট্রোলারের সম্পত্তি মান পেতে) get এই ক্ষেত্রে, পদ্ধতিটির পদ্ধতির মতোই একটি কার্যকারিতা prepareForSegue:রয়েছেUIViewController

আইওএস 8 আপডেট: আনইন্ডাইন্ড সেগগুলি আইওএস 8 এর অভিযোজিত সেগগুলি, যেমন শো এবং শো বিশদরূপেও কাজ করে

একটি উদাহরণ

আমাদের নেভিগেশন কন্ট্রোলার এবং তিনটি চাইল্ড ভিউ কন্ট্রোলার সহ স্টোরিবোর্ড রাখুন:

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

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

উদ্দেশ্য গ:

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

সুইফট:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

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

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

আপনি যে উইন্ডোটি খুলতে চান তাতে আপনাকে অবশ্যই নিয়ন্ত্রকের সংজ্ঞায়িত ক্রিয়াটি নির্বাচন করতে হবে:

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

আপনি ব্লু থেকে রেডেও আনইন্ডিং করতে পারেন (যা নেভিগেশন স্ট্যাকের "দুই ধাপ দূরে")। কীটি সঠিক আনওয়াইন্ড ক্রিয়াটি নির্বাচন করছে।

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

উদ্দেশ্য গ:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

সুইফট:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}

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

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

কোড থেকে অনিচ্ছাকৃত

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

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

সিগ নির্বাচন এবং বৈশিষ্ট্য পরিদর্শকের কাছে যাওয়া "সনাক্তকারী" সম্পত্তিটি প্রকাশ করে। আপনার সিগকে একটি অনন্য শনাক্তকারী দিতে এটি ব্যবহার করুন:

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

এর পরে, আনইন্ড শেগ কোডটি অন্য কোনও সিগের মতোই সম্পাদনা করা যেতে পারে:

উদ্দেশ্য গ:

[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];

সুইফট:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

12
+1 দুর্দান্ত উত্তর। এগুলি সত্যিই দুর্দান্ত লাগছে, তবে পদ্ধতিগুলি কি একই জিনিস পছন্দ করতে dismissViewControllerAnimated:completion:বা popViewControllerAnimated:অর্জন করতে পারে না ?
স্যাম স্পেন্সার

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

7
আপনার ক্রিয়া পদ্ধতিটি আপনার শিরোনামের ফাইলে যুক্ত করার বিষয়টি নিশ্চিত করুন বা অন্যথায় স্টোরিবোর্ডটি জানেন না।
কাইল সি

17
এর অন্য একটি সুবিধা dismissViewControllerAnimated:completion:বা popViewControllerAnimated:এটি হ'ল আপনি যে পদ্ধতিটি অপ্রয়োজনীয় সেই ভিউ কন্ট্রোলারে যুক্ত করেছেন এবং তাই উপস্থাপিত ভিউ কন্ট্রোলারকে উপস্থাপনার ভিউ কন্ট্রোলারের প্রতিনিধি না করেই উপস্থাপিত ভিউ কন্ট্রোলারটি জানার সহজ উপায় আপনার কাছে শেষ ।
হনুস

8
আমি কি সামান্য সম্পাদনার পরামর্শ দিতে পারি? এটি "স্পষ্টতই" পরিষ্কার ছিল না যে আপনি রেখেছিলেন - (আইবিএક્શન) আনউইন্ডটিড্রেড: (ইউআইএসটিবোর্ডসিগ *) অ্যান্ডউইন্ডসিগ রেডভিউকন্ট্রোলআরএম তে, এবং এর পরিবর্তে এটি কোনও স্টোরি বোর্ডের জন্য সবুজ প্রস্থানিত বোতামগুলির "যে কোনও" তে সর্বজনীনভাবে উপলব্ধ। চমত্কার উত্তর এবং এখন আমি এটি অন্যান্য সমস্যার জন্য ব্যবহার করব। ধন্যবাদ!
জন

166

যতক্ষণ না স্টোরিবোর্ডে আনওয়াইন্ড সেগগুলি ব্যবহার করা যায় ...

ধাপ 1)

আপনি যে দৃশ্যটি অনাবৃত করতে চান সেটিতে কোডটিতে যান :

উদ্দেশ্য গ

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

ওজেজে-সি-তে আপনার .h ফাইলেও এই পদ্ধতিটি ঘোষণা করতে ভুলবেন না

দ্রুতগতি

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

ধাপ ২)

স্টোরিবোর্ডে, আপনি যে দৃশ্যটি খুলে ফেলতে চান সেই দৃশ্যে যান এবং কেবল আপনার বাটন থেকে বা আপনার উত্স দর্শনের উপরের ডানদিকে সামান্য কমলা "EXIT" আইকন থেকে কিছুটা টেনে আনুন।

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

"- আনউইন্ডটিওভিউ কনট্রোলারনাম এখানে" - এ সংযোগ করার জন্য এখন বিকল্প থাকতে হবে

এটি হ'ল, যখন আপনার বোতামটি টেপ করা হবে তখন আপনার সেগুটি খুলে যাবে।


5
আমি খুঁজে পেয়েছি যে এক্সকোড 4.5 সঙ্গে এবং এর আগে এটির শিরোনামে আইবিএक्शन ঘোষণা করা প্রয়োজন ছিল। আমি জানি না এটি এখনও সত্য কিনা।
স্টিভেন ফিশার

2
স্টোরিবোর্ড ছাড়াই দ্বিতীয় ধাপে করার কোনও উপায় আছে, অর্থাৎ প্রোগ্রামগতভাবে? আমার স্টোরিবোর্ড (ইন্টারফেস বিল্ডার) গণ্ডগোল পেয়েছে এবং এটি উন্ডাইন্ড সেগগুলি (এক্সকোড বাগ) প্রদর্শন করে না।
ভান ডু ট্রান

46

আনউইন্ড সেগগুলি কিছু ভিউ কন্ট্রোলারের কাছে "ফিরে যেতে" ব্যবহৃত হয় যার থেকে বেশ কয়েকটি বিভাগের মাধ্যমে আপনি "বর্তমান" ভিউ কন্ট্রোলারের কাছে গিয়েছিলেন।

কল্পনা করুন আপনি কিছু একটি আছে MyNavControllerসঙ্গে Aতার রুট দৃশ্য নিয়ামক হিসাবে। এখন আপনি এতে একটি পুশ সিগু ব্যবহার করেন B। এখন নেভিগেশন কন্ট্রোলারটির viewControllersঅ্যারেটিতে A এবং B রয়েছে , এবং বি দৃশ্যমান। এখন আপনি Cমডেল উপস্থাপন ।

বিনোদন segues সঙ্গে, আপনি এখন বিনোদন থেকে "পিছনে" পারা CথেকেB (অর্থাত modally উপস্থাপন দৃশ্য নিয়ামক খারিজ), মূলত মোডাল segue "পূর্বাবস্থায় ফিরিয়ে আনার।" এমনকি আপনি Aমডেল সেগ এবং পুশ সেগ উভয়ই পূর্বাবস্থায় ফিরিয়ে রুট ভিউ কন্ট্রোলারের কাছে সমস্ত পথ খুলে ফেলতে পারেন।

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


7
আপনি dismissViewController:animatedউপস্থাপিত নিয়ামক থেকে কল করতে পারেন । আপনি এটি প্রতিনিধি করতে হবে না। অবশ্যই যদি আপনাকে ডেটা ফেরত দিতে হয় তবে আপনার প্রতিনিধি বা অন্য কোনও পদ্ধতি দরকার।
এমএক্সসিএল

3
আপনি dismissViewController:animated:উপস্থাপিত নিয়ন্ত্রকের কাছ থেকে ফোন করতে পারার সময়, "সেরা অনুশীলন" হ'ল উপস্থাপক কন্ট্রোলারকে আপনার পক্ষে এটি করার জন্য একটি প্রতিনিধি পদ্ধতি কল করা ছিল, যেমন ইয়াং উল্লেখ করেছিলেন।
ক্রিস নোলেট 3

36

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

এইচ
বি এইচ

আপনি কীভাবে আনওয়াইন্ড সিগ সেট আপ করবেন যাতে আপনি সঠিক দর্শন নিয়ন্ত্রকের কাছে ফিরে যান? উত্তরটি হ'ল আপনি A এবং B তে একই নামের সাথে অযাচিত ক্রিয়া ঘোষণা করেন , যেমন:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

এইভাবে, আনইন্ডাইন্ডগুলি যে কোনও দর্শনীয় নিয়ামক ( বা বি) সন্ধান করবে ) সেগটিকে আরম্ভ করেছিল এবং এটিতে ফিরে যাবে।

অন্য কথায়, সেলোগুলি কোথায় আসছে তা বর্ণনা করে অবিচ্ছিন্ন ক্রিয়াটি ভাবুন থেকে চলেছে তার পরিবর্তে থেকে


2
এই তথ্যের জন্য ধন্যবাদ, আমি এটি খুঁজছিলাম।
মধু

2
আমি ইতিমধ্যে সমাধানটি বাস্তবায়ন করায় এই তথ্যটি উল্লেখ করা সত্যিই দুর্দান্ত এবং আমি এখানে আপনার টিপটি না পাওয়া পর্যন্ত কিছুই ঘটবে না আপনার সমর্থনের জন্য অনেক ধন্যবাদ
আমর অ্যাংরি

এটি একটি দুর্দান্ত তথ্য! আপনাকে অনেক ধন্যবাদ!
ডোমিনিক ভায়াল

24

সুইফট আইওএস:

পদক্ষেপ 1: আপনার মাস্টার নিয়ামক দৃষ্টিতে এই পদ্ধতিটি সংজ্ঞায়িত করুন। আপনি ফিরে যেতে চান যা:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

পদক্ষেপ 2: (স্টোরিবোর্ড) আপনার স্ল্যাভ / শিশু প্রস্থান বোতামে রাইট ক্লিক করুন এবং "বোতামাইডাইডেনু" নির্বাচন করুন আপনাকে বোতামে সংযোগ করার জন্য ক্রিয়া হিসাবে আপনি আপনার কাছে ফিরে আসার জন্য ক্লিক করুন মাস্টার নিয়ামক দর্শন:

এখানে চিত্র বর্ণনা লিখুন পদক্ষেপ 3: বিল্ড এবং রান করুন ...


1

উদাহরণস্বরূপ আপনি যদি ভিউ কন্ট্রোলারবি থেকে ভিউকন্ট্রোলার এ নেভিগেট করেন তবে আপনার ভিউতে নিয়ন্ত্রণকারীর নীচে ডেলিগেট কল করবে এবং ডেটা ভাগ করবে।

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}
  • আনউইন্ড সিগু সোর্স ভিউ কন্ট্রোলার (আপনার ভিজিটরের প্রস্থান আইকনের সাথে এক্সিট বাটনটি সংযোগ করতে হবে এবং এটি আনইন্ডসাইগের সাথে সংযুক্ত করতে হবে:

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

  • আনইন্ড সাইডগ সম্পূর্ণ -> ভিউকন্ট্রোলারএর পাঠ্য লেবেল পরিবর্তন করা হয়েছে।

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

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