मुझे इसी तरह की समस्या थी और मेरी "मोडल सेग्यू चेन" सीमित नहीं थी। मैं अलग-अलग चीज़ों के लिए डिज़ाइन किए गए मोडल सेग्स के बारे में उत्तर और टिप्पणियों के तर्कों से सहमत हूं, लेकिन मुझे मोडल सेग्स की "क्षैतिज फ्लिप" एनीमेशन पसंद आया और मुझे उन्हें दोहराने का आसान तरीका नहीं मिला ... सामान्य रूप से मैं भी चीजों का उपयोग करने में कुछ भी गलत नहीं दिखता जो कि किसी अन्य चीज़ को हासिल करने के लिए डिज़ाइन किया गया था, जैसे मोडल नियंत्रकों को चेन करना। दोहराए गए "आंशिक कर्ल" एनीमेशन कुछ ऐप में कुछ परिदृश्य पर भी लागू हो सकता है।
तो मैं नियंत्रक की एक संपत्ति के रूप में मोडल नियंत्रकों के ढेर कार्यान्वित:
@interface ModalViewController : UIViewController
@property (nonatomic, retain) NSMutableArray *modalControllers;
@end
जब पहली मोडल segue ढेर नियंत्रक के prepareForSegue विधि में बन जाता है जाता है कि मोडल नहीं निष्पादित होने
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"modalSegue"]) {
ModalViewController *controller =
(ModalViewController *)[segue destinationViewController];
controller.modalControllers = [NSMutableArray arrayWithObject: controller];
}
}
एक मॉडल नियंत्रक दूसरे करने के लिए ले जाता है जब गंतव्य
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"modalSegue"]) {
ModalViewController *destController =
(ModalViewController *)[segue destinationViewController];
// add destination controller to stack
destController.modalControllers = _modalControllers;
[destController.modalControllers addObject: destController];
}
}
(ModalViewCotroller की विधि में) ढेर में जोड़ा जाता है
एक बार में पूरे ढेर को खारिज करने के लिए सबसे मुश्किल हिस्सा था - आप अगले समाप्त होने से पहले पिछले नियंत्रक को बर्खास्त नहीं कर सकते हैं, इसलिए चक्र काम नहीं करता है, केवल रिकर्सिव ब्लॉक ने चाल की है, मेमोरी लीक से परहेज करते हुए trickiest (मैं अभी तक यह जांच करने के लिए है, लेकिन मैं this पर भरोसा):
- (IBAction)dismissAllModalControllers: (id)sender
{
// recursive block that dismisses one auth controller
// all these dances are to avoid leaks with ARC
typedef void (^voidBlockType)();
__block void (^dismissController)();
voidBlockType __weak dismissCopy = ^void(void) {
dismissController();
};
dismissController = ^void(void) {
int count = [_modalControllers count];
if (count > 0) {
// get last controller
UIViewController *controller =
(UIViewController *)[_modalControllers lastObject];
// remove last controller
[_modalControllers removeLastObject];
// dismiss last controller
[controller
// the first controller in chain is dismissed with animation
dismissViewControllerAnimated: count == 1 ? YES : NO
// on completion call the block that calls this block recursively
completion: dismissCopy];
}
};
// this call dismisses all modal controllers
dismissController();
}
कोई नेविगेशन नियंत्रक नहीं है ... यह एक टैब दृश्य एक दो चरणों मोडल segue श्रृंखला के द्वारा दिखाया नियंत्रक है। –
आप नेविगेशन कंट्रोलर के बिना रूटव्यू पर वापस "पॉपिंग" कर रहे हैं? जिस व्यवहार के लिए आप पूछ रहे हैं वह एक UINavigationController बनाया गया सटीक कारण है। जब तक मैं कुछ याद नहीं कर रहा हूँ? –
क्षमा करें मैं व्यू कंट्रोलर को हटाने की सामान्य समझ में "पॉप" का उपयोग कर रहा हूं। मेरे पास रूट नेविगेशन कंट्रोलर नहीं है - मेरे पास दो मानक व्यू कंट्रोलर हैं जो ऐप में मोडल सेग्यू के माध्यम से "सुरंग" हैं और फिर एक टैब व्यू कंट्रोलर जिसमें अन्य विचार शामिल हैं। मैंने जवाब निकाला, हालांकि ... नीचे देखें। –