การเปลี่ยนแปลงภาพเคลื่อนไหวของตัวควบคุมมุมมองโดยไม่ต้องใช้ตัวควบคุมทิศทางกองซ้อนตัวควบคุมย่อยหรือตัวควบคุม modal?


142

NavigationControllers มีกอง ViewController ในการจัดการและการเปลี่ยนภาพเคลื่อนไหว จำกัด

การเพิ่มตัวควบคุมมุมมองเป็นมุมมองย่อยไปยังตัวควบคุมมุมมองที่มีอยู่ต้องผ่านเหตุการณ์ไปยังตัวควบคุมมุมมองย่อยซึ่งเป็นความเจ็บปวดในการจัดการเต็มไปด้วยความรำคาญเล็กน้อยและโดยทั่วไปรู้สึกเหมือนแฮ็คที่ไม่ดีเมื่อใช้งาน ทำสิ่งนี้)

การนำเสนอตัวควบคุมมุมมอง modal อีกครั้งวางตัวควบคุมมุมมองด้านบนของอีกและในขณะที่มันไม่มีปัญหาผ่านเหตุการณ์ที่อธิบายไว้ข้างต้นมันไม่ 'สลับ' ตัวควบคุมมุมมองจริง ๆ มันซ้อนกัน

สตอรีบอร์ดนั้น จำกัด อยู่ที่ iOS 5 และเกือบจะสมบูรณ์แบบ แต่ไม่สามารถใช้ได้ในทุกโครงการ

ใครบางคนสามารถนำเสนอตัวอย่างรหัส SOLID ในวิธีการเปลี่ยนมุมมองตัวควบคุมโดยไม่มีข้อ จำกัด ข้างต้นและช่วยให้การเปลี่ยนภาพเคลื่อนไหวระหว่างพวกเขา?

ตัวอย่างปิด แต่ไม่มีภาพเคลื่อนไหว: วิธีการใช้ตัวควบคุมมุมมองกำหนดเอง iOS หลายตัวโดยไม่มีตัวควบคุมการนำทาง

แก้ไข: การใช้ Nav Controller นั้นใช้ได้ แต่ต้องมีรูปแบบการเปลี่ยนภาพเคลื่อนไหว (ไม่ใช่แค่เอฟเฟ็กต์ภาพนิ่ง) ตัวควบคุมมุมมองที่แสดงจะต้องถูกเปลี่ยนอย่างสมบูรณ์ (ไม่ซ้อนกัน) ถ้าตัวควบคุมมุมมองที่สองต้องเอาตัวควบคุมมุมมองอื่นออกจากสแต็กแสดงว่าตัวควบคุมนั้นดูไม่เพียงพอ

แก้ไข 2: iOS 4 ควรเป็นระบบปฏิบัติการพื้นฐานสำหรับคำถามนี้ฉันควรชี้แจงว่าเมื่อกล่าวถึงกระดานเรื่องราว (ด้านบน)


1
คุณสามารถทำการเปลี่ยนภาพเคลื่อนไหวที่กำหนดเองด้วยตัวควบคุมทิศทาง หากสิ่งนี้ยอมรับได้โปรดลบข้อ จำกัด นั้นออกจากคำถามของคุณและฉันจะโพสต์ตัวอย่างโค้ด
Richard Brightwell

@ ริชาร์ดถ้ามันข้ามความยุ่งยากในการจัดการสแต็กและรองรับสไตล์การเปลี่ยนภาพเคลื่อนไหวที่แตกต่างกันระหว่างมุมมองคอนโทรลเลอร์คอนโทรลเลอร์การนำทางจะใช้งานได้ดี!
TigerCoding

OK ดี. ฉันใจร้อนและโพสต์รหัส ให้มันลอง. ได้ผลสำหรับฉัน
Richard Brightwell

@RichardBright คุณพูดที่นี่ว่าสามารถทำการเปลี่ยนภาพเคลื่อนไหวที่กำหนดเองระหว่างตัวควบคุมมุมมองโดยใช้ตัวควบคุมทิศทาง ... ได้อย่างไร คุณสามารถโพสต์ตัวอย่างได้ไหม? ขอบคุณ
Duck

คำตอบ:


108

แก้ไข: คำตอบใหม่ที่ใช้งานได้ในทุกทิศทาง คำตอบดั้งเดิมจะใช้ได้เมื่ออินเตอร์เฟสอยู่ในแนวตั้งเท่านั้น นี่คือภาพเคลื่อนไหวการเปลี่ยนมุมมอง b / c ที่แทนที่มุมมองที่มีมุมมองที่แตกต่างกันจะต้องเกิดขึ้นกับมุมมองอย่างน้อยระดับต่ำกว่ามุมมองแรกที่เพิ่มเข้าไปในหน้าต่าง (เช่นwindow.rootViewController.view.anotherView)

TransitionControllerฉันได้ดำเนินการผมระดับภาชนะที่เรียกกันแบบง่ายๆ คุณสามารถค้นหาได้ที่https://gist.github.com/1394947

นอกเหนือจากนี้ฉันชอบการนำไปใช้ในคลาส b / c ที่แยกต่างหากซึ่งง่ายต่อการใช้ซ้ำ หากคุณไม่ต้องการสิ่งนั้นคุณสามารถใช้ตรรกะเดียวกันได้โดยตรงในตัวแทนแอพของคุณโดยไม่จำเป็นต้องมีTransitionControllerคลาส ตรรกะที่คุณต้องการจะเหมือนกันอย่างไรก็ตาม

ใช้มันดังต่อไปนี้:

ในแอพของคุณ

// add a property for the TransitionController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    MyViewController *vc = [[MyViewContoller alloc] init...];
    self.transitionController = [[TransitionController alloc] initWithViewController:vc];
    self.window.rootViewController = self.transitionController;
    [self.window makeKeyAndVisible];
    return YES;
}

เมื่อต้องการเปลี่ยนไปใช้ตัวควบคุมมุมมองใหม่จากตัวควบคุมมุมมองใด ๆ

- (IBAction)flipToView
{
    anotherViewController *vc = [[AnotherViewController alloc] init...];
    MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    [appDelegate.transitionController transitionToViewController:vc withOptions:UIViewAnimationOptionTransitionFlipFromRight];
}

แก้ไข: คำตอบเดิมด้านล่าง - ใช้งานได้สำหรับการวางแนว portait เท่านั้น

ฉันทำสมมติฐานต่อไปนี้สำหรับตัวอย่างนี้:

  1. คุณมีตัวควบคุมมุมมองที่กำหนดเป็นrootViewControllerหน้าต่างของคุณ

  2. เมื่อคุณเปลี่ยนเป็นมุมมองใหม่คุณต้องการแทนที่ viewController ปัจจุบันด้วย viewController ที่เป็นเจ้าของมุมมองใหม่ เมื่อใดก็ตามที่ viewController ปัจจุบันเท่านั้นยังมีชีวิตอยู่ (เช่น alloc'ed)

รหัสสามารถแก้ไขได้อย่างง่ายดายเพื่อให้ทำงานแตกต่างกันจุดสำคัญคือการเปลี่ยนแปลงภาพเคลื่อนไหวและตัวควบคุมมุมมองเดียว window.rootViewControllerตรวจสอบให้แน่ใจว่าคุณไม่รักษาตัวควบคุมมุมมองที่ใดก็ได้นอกของการกำหนดมัน

รหัสเพื่อการเปลี่ยนแปลงภาพเคลื่อนไหวในตัวแทนแอพ

- (void)transitionToViewController:(UIViewController *)viewController
                    withTransition:(UIViewAnimationOptions)transition
{
    [UIView transitionFromView:self.window.rootViewController.view
                        toView:viewController.view
                      duration:0.65f
                       options:transition
                    completion:^(BOOL finished){
                        self.window.rootViewController = viewController;
                    }];
}

ตัวอย่างการใช้งานในตัวควบคุมมุมมอง

- (IBAction)flipToNextView
{
    AnotherViewController *anotherVC = [[AnotherVC alloc] init...];
    MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
    [appDelegate transitionToViewController:anotherVC
                             withTransition:UIViewAnimationOptionTransitionFlipFromRight];
}

1
ใช่เป็นคนดีมาก! มันไม่เพียง แต่ทำเคล็ดลับเท่านั้น แต่ยังเป็นตัวอย่างโค้ดที่ง่ายและสะอาดตา ขอบคุณมาก!
TigerCoding

เขาทำให้เกิดปัญหาในแนวนอนสำหรับคุณหรือไม่? นอกจากนี้: สิ่งนี้เรียกใช้วิธีการ willAppear และ didAppear ของ viewControllers หรือไม่?
เฟลิกซ์ Lamouroux

1
ฉันรู้ว่ามีการโทรปรากฏขึ้นเพราะฉันบันทึกพวกเขา ฉันไม่เห็นด้วยว่าทำไมสิ่งนี้จึงมีผลต่อการเปลี่ยนแปลงการวางแนว คุณช่วยอธิบายได้ไหมว่าทำไมถึงคิดว่ามันจะเป็นเช่นนั้น?
TigerCoding

1
@ Xones โซลูชันที่ยอดเยี่ยมทำงานได้ดีในแอพ iPad ของฉันยกเว้นปัญหาเดียวที่ฉันพบหลังจาก transis initialization ครั้งแรก = [TransitionController ... initWithViewController: aUINavCtrlObj]; window.rootVC = transVC; มุมมองใน aUINavCtrlObj นั้นเพิ่มขึ้น 20px จากด้านบน (เช่นด้านล่าง 20 px อยู่นอกขอบเขตหน้าจอ (UIWindow) ในทุกทิศทาง) แต่หลังจากฉันเปลี่ยน [transVC transitionToViewController: anotherVC] ฉันพยายาม wantsFullScreenLayout = NO ใน loadView ของ TransitionController สิ่งที่ทำคือเพิ่มพื้นที่สีดำ 20 พิกเซลภายใต้ statusBar
Abduliam Rehmanius

1
@ AbduliamRehmanius: ฉันมีปัญหาเดียวกัน ฉันแก้ไขมันโดยเปลี่ยน line 25 TransitionController.mเป็นUIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];เป็น แต่ฉันใช้สิ่งนี้กับ iOS เวอร์ชันใหม่ล่าสุดเท่านั้นดังนั้นทดสอบอย่างระมัดระวัง
Phil Calvin

67

คุณสามารถใช้ระบบควบคุม viewController ใหม่ของ Apple สำหรับข้อมูลเชิงลึกเพิ่มเติมโปรดดูวิดีโอเซสชั่น WWDC 2011 "Implementing UIViewControllerContainment"

ใหม่สำหรับ iOS5, UIViewControllerContainment อนุญาตให้คุณมี parent viewController และจำนวน child viewControllers ที่อยู่ในนั้น นี่คือการทำงานของ UISplitViewController การทำเช่นนี้คุณสามารถควบคุมมุมมองสแต็กในพาเรนต์ แต่สำหรับแอ็พพลิเคชันเฉพาะของคุณคุณเพียงแค่ใช้พาเรนต์เพื่อจัดการการเปลี่ยนจาก viewController หนึ่งที่มองเห็นได้ไปเป็นอีกอันหนึ่ง นี่เป็นวิธีที่ Apple อนุมัติในการทำสิ่งต่าง ๆ และการสร้างภาพเคลื่อนไหวจาก viewController ลูกหนึ่งคนนั้นไม่เจ็บปวด รวมทั้งคุณจะได้ใช้UIViewAnimationOptionช่วงการเปลี่ยนภาพที่แตกต่างหลากหลาย!

นอกจากนี้ด้วย UIViewContainment คุณไม่ต้องกังวลเกี่ยวกับความยุ่งเหยิงของการจัดการ child viewControllers ระหว่างการปฐมนิเทศ คุณสามารถใช้สิ่งต่อไปนี้เพื่อให้แน่ใจว่า parentViewController ส่งต่อเหตุการณ์การหมุนไปยัง child viewControllers

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers{
    return YES;
}

คุณสามารถทำสิ่งต่อไปนี้หรือคล้ายกันในเมธอด viewDidLoad ของคุณเพื่อตั้งค่า childViewController แรก:

[self addChildViewController:self.currentViewController];
[self.view addSubview:self.currentViewController.view];
[self.currentViewController didMoveToParentViewController:self];
[self.currentViewController.swapViewControllerButton setTitle:@"Swap" forState:UIControlStateNormal];

จากนั้นเมื่อคุณต้องการเปลี่ยน child viewController คุณเรียกบางสิ่งตามบรรทัดต่อไปนี้ภายใน parent viewController:

-(void)swapViewControllers:(childViewController *)addChildViewController:aNewViewController{
     [self addChildViewController:aNewViewController];
     __weak __block ViewController *weakSelf=self;
     [self transitionFromViewController:self.currentViewController
                       toViewController:aNewViewController
                               duration:1.0
                                options:UIViewAnimationOptionTransitionCurlUp
                             animations:nil
                             completion:^(BOOL finished) {
                                   [aNewViewController didMoveToParentViewController:weakSelf];

                                   [weakSelf.currentViewController willMoveToParentViewController:nil];
                                   [weakSelf.currentViewController removeFromParentViewController];

                                   weakSelf.currentViewController=[aNewViewController autorelease];
                             }];
 }

ผมโพสต์เป็นโครงการตัวอย่างเต็มรูปแบบที่นี่: https://github.com/toolmanGitHub/stackedViewControllers นี้โครงการอื่น ๆ ที่แสดงให้เห็นถึงวิธีการใช้UIViewControllerบรรจุในบางรูปแบบการใส่ viewController ต่างๆที่ไม่ได้ใช้ทั้งหน้าจอ โชคดี


1
ตัวอย่างที่ดี ขอบคุณที่สละเวลาโพสต์โค้ด ในทางกลับกันมัน จำกัด เฉพาะ iOS 5 เท่านั้น ดังที่กล่าวไว้ในคำถาม: "[กระดานเรื่องราว] ถูก จำกัด ให้ใช้กับ iOS 5 และเกือบจะสมบูรณ์แบบ แต่ไม่สามารถใช้ได้ในทุกโครงการ" เมื่อพิจารณาถึงลูกค้าจำนวนมาก (ประมาณ 40%) ลูกค้ายังคงใช้ iOS 4 เป้าหมายคือเพื่อมอบสิ่งที่ใช้งานได้ใน iOS 4 ขึ้นไป
TigerCoding

คุณไม่ควรโทร [self.currentViewController willMoveToParentViewController:nil];เข้ามาก่อนการเปลี่ยน?
เฟลิกซ์ Lamouroux

@FelixLam - สำหรับเอกสารในการบรรจุ UIViewController คุณจะเรียกใช้ willMoveToParentViewController เฉพาะเมื่อคุณแทนที่เมธอด addChildViewController ในตัวอย่างนี้ฉันกำลังเรียกมัน แต่ไม่เอาชนะ
timthetoolman

2
ในการสาธิตที่ WWDC ฉันดูเหมือนจะจำได้ว่าพวกเขาเรียกมันว่าก่อนที่จะเริ่มต้นการเปลี่ยนแปลงเนื่องจากการเปลี่ยนแปลงไม่ได้หมายความว่าปัจจุบัน VC จะย้ายไปที่ศูนย์ ในกรณีของ UITabBarController การเปลี่ยนแปลงจะไม่เปลี่ยนพาเรนต์ของ vc ใด ๆ การลบจากพาเรนต์เรียกใช้ didMoveToParentViewController: nil แต่ไม่มีการโทร ... IMHO
Felix Lamouroux

7

ตกลงฉันรู้คำถามว่าโดยไม่ต้องใช้ตัวควบคุมทิศทาง แต่ไม่มีเหตุผล OP ไม่ตอบสนองต่อความเห็นในเวลาที่ฉันจะไปนอน อย่าลงคะแนนฉัน :)

ต่อไปนี้เป็นวิธีแสดงป็อปอัพคอนโทรลเลอร์มุมมองปัจจุบันและพลิกไปที่คอนโทรลเลอร์มุมมองใหม่โดยใช้ตัวควบคุมทิศทาง:

UINavigationController *myNavigationController = self.navigationController;
[[self retain] autorelease];

[myNavigationController popViewControllerAnimated:NO];

PreferencesViewController *controller = [[PreferencesViewController alloc] initWithNibName:nil bundle:nil];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: 0.65];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myNavigationController.view cache:YES];
[myNavigationController pushViewController:controller animated:NO];
[UIView commitAnimations];

[controller release];

ตัวควบคุมมุมมองสแต็กนี้ใช่หรือไม่
TigerCoding

1
ใช่เพราะเราใช้ตัวควบคุมทิศทาง อย่างไรก็ตามมันได้รับการ จำกัด เกี่ยวกับชนิดของการเปลี่ยนที่คุณสามารถทำได้ซึ่งฉันคิดว่าเป็นแกนหลักของคำถามของคุณ
Richard Brightwell

ปิด แต่ปัญหาใหญ่อย่างหนึ่งคือมีตัวควบคุมมุมมองหลายตัวเพื่อจัดการกับสแต็ก ฉันกำลังมองหาวิธีที่จะเปลี่ยนมุมมองตัวควบคุมอย่างสมบูรณ์ =)
TigerCoding

อา. ฉันอาจมีบางอย่างเช่นนั้นด้วย ... ขอเวลาสักครู่ ถ้าไม่ฉันจะลบคำตอบนี้
Richard Brightwell

ตกลงฉันปูด้วยกันสองบิตของรหัสที่แตกต่างกัน ฉันคิดว่านี่จะทำสิ่งที่คุณต้องการ
Richard Brightwell

3

เนื่องจากฉันเพิ่งเกิดปัญหาที่แน่นอนนี้และลองใช้คำตอบที่มีอยู่ทั้งหมดก่อนเพื่อความสำเร็จที่ จำกัด ฉันจะโพสต์ว่าฉันจะแก้ไขได้อย่างไรในที่สุด:

ดังที่อธิบายไว้ในโพสต์นี้ในส่วนย่อยที่กำหนดเองจริงๆแล้วมันเป็นเรื่องง่ายที่จะสร้างส่วนย่อยที่กำหนดเอง พวกเขายังง่ายมากที่จะติดตั้งส่วนต่อประสานในตัวสร้างพวกเขารักษาความสัมพันธ์ใน IB ที่มองเห็นได้และพวกเขาไม่ต้องการการสนับสนุนมากจากตัวควบคุมมุมมองต้นทาง / ปลายทางของ Segue

โพสต์ที่ลิงก์ด้านบนแสดงโค้ด iOS 4 เพื่อแทนที่คอนโทรลเลอร์มุมมองปัจจุบันบนสแต็ก navigationController ด้วยสแต็กใหม่ที่ใช้ภาพเคลื่อนไหวแบบเลื่อนจากด้านบน

ในกรณีของฉันฉันต้องการให้การแทนที่ที่คล้ายกันเกิดขึ้น แต่มีการFlipFromLeftเปลี่ยนแปลง ฉันต้องการการสนับสนุนสำหรับ iOS 5 ขึ้นไปเท่านั้น รหัส:

จาก RAFlipReplaceSegue.h:

#import <UIKit/UIKit.h>

@interface RAFlipReplaceSegue : UIStoryboardSegue
@end

จาก RAFlipReplaceSegue.m:

#import "RAFlipReplaceSegue.h"

@implementation RAFlipReplaceSegue

-(void) perform
{
    UIViewController *destVC = self.destinationViewController;
    UIViewController *sourceVC = self.sourceViewController;
    [destVC viewWillAppear:YES];

    destVC.view.frame = sourceVC.view.frame;

    [UIView transitionFromView:sourceVC.view
                        toView:destVC.view
                      duration:0.7
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:^(BOOL finished)
                    {
                        [destVC viewDidAppear:YES];

                        UINavigationController *nav = sourceVC.navigationController;
                        [nav popViewControllerAnimated:NO];
                        [nav pushViewController:destVC animated:NO];
                    }
     ];
}

@end

ตอนนี้ลาก - ควบคุมเพื่อตั้งค่าการแยกประเภทอื่น ๆ แล้วทำให้มันเป็น Custom Segue และพิมพ์ในชื่อของ class Segue ที่กำหนดเองและอื่น ๆ !


มีวิธีใดในการเขียนโปรแกรมแบบนี้โดยไม่มีสตอรี่บอร์ดหรือไม่?
zakdances

เท่าที่ฉันรู้เพื่อใช้ซีคิวที่คุณต้องกำหนดและให้มันระบุในกระดานเรื่องราว คุณสามารถเรียกใช้ segue ในรหัสด้วย–performSegueWithIdentifier:sender:วิธีการของ UIViewController
Ryan Artecona

1
คุณไม่ควรเรียก viewDidXXX และ viewWillXXX โดยตรง
Ben Sinclair

2

ฉันดิ้นรนกับอันนี้มานานและหนึ่งในปัญหาของฉันอยู่ที่นี่ฉันไม่แน่ใจว่าคุณมีปัญหานั้นหรือไม่ แต่นี่คือสิ่งที่ฉันอยากจะแนะนำถ้ามันต้องทำงานกับ iOS 4

ประการแรกสร้างNavigationControllerคลาสใหม่ นี่คือที่ที่เราจะทำงานสกปรกทั้งหมด - คลาสอื่น ๆ จะสามารถ "หมดจด" วิธีการโทรเช่นpushViewController:และอื่น ๆ ใน.h:

@interface NavigationController : UIViewController {
    NSMutableArray *childViewControllers;
    UIViewController *currentViewController;
}

- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL))completion;
- (void)addChildViewController:(UIViewController *)childController;
- (void)removeChildViewController:(UIViewController *)childController;

อาร์เรย์ตัวควบคุมมุมมองลูกจะทำหน้าที่เป็นที่เก็บสำหรับตัวควบคุมมุมมองทั้งหมดในสแต็กของเรา เราจะส่งต่อการหมุนและรหัสการปรับขนาดโดยอัตโนมัติจากNavigationController's currentControllerมุมมองในการ

ตอนนี้ในการดำเนินการของเรา:

- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL))completion
{
    currentViewController = [toViewController retain];
    // Put any auto- and manual-resizing handling code here

    [UIView animateWithDuration:duration animations:animations completion:completion];

    [fromViewController.view removeFromSuperview];
}

- (void)addChildViewController:(UIViewController *)childController {
    [childViewControllers addObject:childController];
}

- (void)removeChildViewController:(UIViewController *)childController {
    [childViewControllers removeObject:childController];
}

ตอนนี้คุณสามารถใช้ของคุณเองpushViewController:, popViewControllerและเช่นใช้วิธีการสายเหล่านี้

ขอให้โชคดีและฉันหวังว่านี่จะช่วยได้!


อีกครั้งเราต้องหันไปใช้การเพิ่มตัวควบคุมมุมมองเป็นมุมมองย่อยของตัวควบคุมมุมมองที่มีอยู่ จริงอยู่นี่คือสิ่งที่ Navigation Controller ที่มีอยู่ทำ แต่หมายความว่าเราต้องเขียนใหม่และวิธีการทั้งหมด ในความเป็นจริงเราควรหลีกเลี่ยงการแจกจ่าย viewWillAppear และวิธีการที่คล้ายกัน ฉันเริ่มคิดว่าไม่มีวิธีที่ดีในการทำเช่นนี้ อย่างไรก็ตามฉันขอขอบคุณที่สละเวลาและความพยายาม!
TigerCoding

ฉันคิดว่าด้วยระบบนี้ในการเพิ่มและลบตัวควบคุมมุมมองตามต้องการโซลูชันนี้จะป้องกันไม่ให้คุณต้องส่งต่อวิธีการเหล่านั้น
aopsfan

คุณแน่ใจไหม? ฉันเคยสลับมุมมองคอนโทรลเลอร์ในลักษณะที่คล้ายกันมาก่อนและฉันต้องส่งต่อข้อความเสมอ คุณสามารถยืนยันเป็นอย่างอื่นได้หรือไม่
TigerCoding

ไม่ฉันไม่แน่ใจ แต่ผมจะคิดว่าตราบใดที่คุณเอามุมมองมุมมองของตัวควบคุมที่พวกเขาหายไปและเพิ่มพวกเขาเป็นพวกเขาจะปรากฏที่ควรโดยอัตโนมัติทริกเกอร์viewWillAppear, viewDidAppearและเช่น
aopsfan

-1
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *viewController = (UINavigationController *)[storyboard instantiateViewControllerWithIdentifier:@"storyBoardIdentifier"];
viewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentViewController:viewController animated:YES completion:nil];

ลองใช้รหัสนี้


รหัสนี้ให้การเปลี่ยนจากตัวควบคุมมุมมองไปยังตัวควบคุมมุมมองอื่นซึ่งมีตัวควบคุมการนำทาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.