2012-04-23 27 views
20

Tôi đang xây dựng ứng dụng khách web iOS 5.1 sử dụng bảng phân cảnh. Một trong những hành động của tôi là "đăng xuất", trong đó tôi muốn đặt lại chế độ xem gốc của mình thành chế độ xem ban đầu được tạo bởi chế độ xem gốc của Bảng phân cảnh. (Khi bạn đăng nhập, một số mục xem được xóa hoặc thêm dựa trên bạn là ai; khi bạn đăng xuất, tôi muốn đặt lại chúng về giá trị mặc định của chúng, mà tôi đã chỉ định trong bảng phân cảnh.)Đặt lại bảng phân cảnh khi đăng xuất

Tôi nhận ra tôi có thể thiết lập lại/thêm lại tất cả các phần tử theo chương trình, nhưng sau đó bảng phân cảnh là gì? Tôi nghĩ rằng có một cách để trở lại hình vuông bằng cách tải lại tệp xem, đúng không?

+0

Bạn đã bao giờ tìm ra điều này chưa? Tôi có chính xác nhu cầu tương tự cho điều này ... –

Trả lời

28

Tôi đã tìm thấy cách tiếp cận sau đây phù hợp với tôi. Xin lưu ý rằng tôi sử dụng ARC, không chắc chắn nếu điều này có mang nhiều về giải pháp tuy nhiên. Thứ nhất, trong lớp đại biểu ứng dụng, trong application:didFinishLaunchingWithOptions: tôi nắm bắt được dụ Storyboard inital với dòng mã sau đây:

_initalStoryboard = self.window.rootViewController.storyboard; 

(Rõ ràng là có một thể hiện biến UIStoryboard* _initalStoryboard;)

Sau đó, tôi đã hàm sau được xác định trong ủy quyền ứng dụng của tôi:

- (void)resetWindowToInitialView 
{ 
    for (UIView* view in self.window.subviews) 
    { 
     [view removeFromSuperview]; 
    } 

    UIViewController* initialScene = [_initalStoryboard instantiateInitialViewController]; 
    self.window.rootViewController = initialScene; 
} 

Vui lòng lưu ý vòng lặp loại bỏ tất cả các bản xem trước từ window. Tài liệu UIWindow rootViewController nêu rõ:

Nếu cửa sổ có phân cấp khung nhìn hiện tại, chế độ xem cũ sẽ bị xóa trước khi cài đặt mới được xóa.

Tuy nhiên, tôi không thấy đây là trường hợp ... vì vậy tôi tự xóa các chế độ xem hiện tại một cách rõ ràng trước khi gán một rootViewController mới. Tôi đã không tìm thấy bất kỳ tác dụng phụ đáng lo ngại hoặc rò rỉ bộ nhớ bằng cách sử dụng phương pháp này. Tôi không có nghĩa là một chuyên gia về sự kỳ diệu của UIKit vì vậy tôi sẽ đề nghị bạn kiểm tra thử nghiệm và kiểm tra lại giải pháp này nếu bạn có kế hoạch sử dụng nó cho mình. Chúc mừng

+0

Tôi muốn thử điều này, nhưng không thực sự cho thấy làm thế nào để đi về gọi chức năng từ một bộ điều khiển khi một nút được nhấn. – gdubs

+2

Kiểm tra câu hỏi SO này: http://stackoverflow.com/questions/1184146/getting-a-reference-to-the-uiapplication-delegate Nó cho thấy cách bạn có thể nhận được một tham chiếu đến đại biểu ứng dụng của bạn - trong trường hợp của bạn bạn sẽ sử dụng nó trong bộ điều khiển khung nhìn của cảnh. Vì vậy, trong nút bấm của bạn trên bộ xử lý cảm ứng, bạn sẽ có một cái gì đó như: MyApplicationDelegate * appDelegate = (MyApplicationDelegate *) [[UIApplication sharedApplication] delegate]; [appDelegate resetWindowToInitialView]; –

+2

cảm ơn ông chủ .... – gdubs

1

Sau đây hoạt động tuyệt vời đối với tôi, nếu bạn sử dụng một cấu trúc NavController dựa trên:

UIWindow *window = [[UIApplication sharedApplication].windows firstObject]; 
UINavigationController *navController = (UINavigationController *)window.rootViewController; 
UIViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"Login"]; 
navController.viewControllers = @[vc]; 

Bạn phải gán Storyboard ID "Đăng nhập" để đăng nhập VC của bạn để cho tiện làm việc.

0

Các công trình sau đây đối với tôi, nếu tôi sử dụng một cấu trúc dựa trên UISplitViewController (thử nghiệm trên iOS 8+):

Remove Storyboard từ dự án chung ->Triển khai Thông tin, vì vậy thả xuống trông giống như bên dưới và bạn phải định cấu hình bảng phân cảnh trong mã.

Deployment Info Empty Main Interface

Một nơi nào đó trong AppDelegate.m

- (void)setupViewControllers 
{ 
    // check for thread, as this method might be called by other (e.g. logout) logic 
    if ([NSThread currentThread] != [NSThread mainThread]) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setupViewControllers]; 
     }); 
     return; 
    } 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
    UIViewController *vc =[storyboard instantiateInitialViewController]; 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.rootViewController = vc; 

    // configure split vc 
    // Note: I reference split vc for my own purpose, but it is your mater of choice 
    self.splitViewController = (UISplitViewController *)self.window.rootViewController; 
    self.splitViewController.delegate = self; 
    self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; 
    self.splitViewController.preferredPrimaryColumnWidthFraction = 0.5; 

    [self.window makeKeyAndVisible]; 
} 

Để tránh trùng lặp mã, gọi chức năng này từ application:didFinishLaunchingWithOptions: như một thiết lập lần đầu

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // some code... 
    [self setupViewControllers]; 
    // Optional: add splash view (e.g. [self addSplashView];) 
    // some code... 
} 

Bên trong một bộ điều khiển xem bạn đã sẵn sàng hiển thị giao diện người dùng cho người dùng, loại bỏ chế độ xem giật gân.Ví dụ: (trong Swift):

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    if !AppSession.currentSession().isLoggedIn() { 
     presentLoginViewController(false, completion: {()->Void in 
      self.removeSplash() 
     }) 
    } 
    else { 
     removeSplash() 
    } 

    // some code... 
} 

private func removeSplash() { 
    if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate { 
     appDelegate.removeSplashView() 
    } 
} 
Các vấn đề liên quan