2012-05-10 28 views
5

Tôi đang làm việc trên một ứng dụng mà lúc khởi động kiểm tra thông tin đăng nhập hợp lệ, và nếu chúng được tìm thấy và không hết hạn bộ điều khiển chia tách chính được hiển thị, và nếu không phải là một màn hình đăng nhập sẽ được hiển thị.Có thể thực hiệnSegueWithIdentifier được sử dụng với AppDelegate không?

Mỗi phần hoạt động tốt một cách riêng biệt, nhưng tôi đang vật lộn với cách tốt nhất lúc khởi chạy để chọn chế độ xem phù hợp để hiển thị.

Tôi đã cố gắng thiết lập một segue phương thức từ bộ điều khiển xem gốc, và trong ứng dụng của tôi: didFinishLaunchingWithOptions: chức năng trong App đại biểu, kêu gọi này:

// Segue to the login view controller... 
if (loginNeeded) { 
    [self.window.rootViewController performSegueWithIdentifier:@"LoginScreen" sender:self]; 
} 

này một cách hợp lý nên làm việc, nhưng kích hoạt segues từ trong đại biểu ứng dụng dường như là không thể.

Nơi lý tưởng và kỹ thuật để xử lý vấn đề này là gì?

+0

Tại sao bạn thậm chí còn ném đại biểu? Tại sao không làm điều đầu tiên trên 'ViewdidLoad' – Sirens

Trả lời

4

Bạn có thể thử một khoảng cách tùy chỉnh, theo bài đăng này hiding-a-segue-on-login-process.

Hoặc nếu bạn đang tuyệt vọng để có màn hình hiển thị đăng nhập trước khi tải split view controller thử một cái gì đó dọc theo dòng sau đây ...

Tạo màn hình đăng nhập của bạn trên các kịch bản chính là, nói rằng, một lớp con của UIViewController . Đảm bảo rằng đây là cảnh ban đầu (kiểm tra Là Bộ điều khiển Chế độ xem Ban đầu).

Trên bảng phân cảnh, hãy tạo một khoảng cách mới từ lớp đăng nhập của bạn thành SplitViewController gốc. Đặt cho nó một số nhận dạng, 'Load SplitViewController' và tên lớp tùy chỉnh segue mà chúng tôi sẽ gọi FullyReplaceSegue.

Trong đăng nhập tập tin lớp .m của bạn, thêm mã để được gọi khi người dùng đã đăng nhập:

[self performSegueWithIdentifier:@"Load SplitViewController" sender:self]; 

Tạo lớp segue mới, dựa trên UIStoryboardSegue và đặt tên là FullyReplaceSegue theo ở trên.

.h tập tin

#import <UIKit/UIKit.h> 
@interface : UIStoryboardSegue 

@end 

.m tập tin

#import "FullyReplaceSegue.h" 

@implementation FullyReplaceSegue 

- (void)perform 
{ 
    UIViewController *dest = (UIViewController *) super.destinationViewController; 
    UIWindow *window = [UIApplication sharedApplication].keyWindow; 
    window.rootViewController = dest; 

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     UISplitViewController *splitViewController = (UISplitViewController *)dest; // assumes we're transitioning to a UISplitViewController! 
     UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
     splitViewController.delegate = (id)navigationController.topViewController; 
    } 
} 

@end 
+0

Tôi đã không kết thúc cố gắng này, nhưng đây có vẻ như một giải pháp cực kỳ thông minh. – radven

1

Tại sao bạn không tải màn hình có thể nhìn thấy được giả sử thông tin xác thực đăng nhập thích hợp và không hết hạn (bằng cách đặt nó làm bộ điều khiển chế độ xem gốc của cửa sổ), và sau đó trong viewDidLoad của trình điều khiển chế độ xem đầu tiên đó, kiểm tra xem có cần cập nhật thông tin xác thực đăng nhập hay không. Nếu vậy, hãy chuyển sang bộ điều khiển chế độ xem đăng nhập.

+0

Apple yêu cầu Bộ điều khiển Split View là gốc, vì vậy thực sự không phải là nơi để khai thác vào viewDidLoad trừ khi tôi phân lớp. Có vẻ như phải có một cách đơn giản hơn. – radven

+0

Vì vậy, hãy tách phần gốc và kiểm tra trong viewDidLoad của một bộ điều khiển xem của bạn. Ý tưởng là như nhau. – jmstone617

+0

Tôi đã thử rằng bây giờ - và phân biệt trong viewDidLoad không hoạt động. Tôi đã hỏi một câu hỏi khác nhưng có liên quan với một số chi tiết ở đây: http://stackoverflow.com/questions/10541852/correctly-present-conditional-login-screen-at-app-startup-with-storyboards-and-s – radven

4

Đây là cách tôi đã làm nó.

Trong didFinishLaunchingWithOptions:

//save the root view controller 
[[self window] makeKeyAndVisible]; 
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 
rootController = [[navigationController viewControllers] objectAtIndex:0]; 

Một nơi nào đó khác trong các đại biểu ứng dụng:

[rootController performSegueWithIdentifier:@"fileSegueID" sender:self]; 

Sau đó, trong kịch bản, tạo ra một segue từ quan điểm cho rằng bị gán là "rootController", đến chế độ xem tùy chọn mong muốn và cung cấp khoảng cách mới đó cho id fileSegueID.Phải mất một số gỡ lỗi để đảm bảo biến số rootController được gán cho chế độ xem chính xác.

+2

Cảm ơn! '[[cửa sổ tự] makeKeyAndVisible];' là những gì tôi đã mất tích. –

2

Có thể hơi muộn, nhưng tôi đang tìm kiếm các đề xuất tương tự. Đây là những gì tôi làm.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Signup" bundle:nil]; 
    if(isLoggedIn) { 
    UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 
    IndexController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"IndexController"]; 
    [navigationController pushViewController:ivc animated:NO]; 
} 
0

Có, nó có thể được sử dụng, nếu bạn tham chiếu đến bộ điều khiển chế độ xem phụ huynh của segue. Bạn có thể nhận được nó như thế này:

UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 

[[[navigationController viewControllers] objectAtIndex:0] performSegueWithIdentifier:@"LoginScreen" sender:self]; 

này sẽ chỉ làm việc nếu chỉ số trong mảng viewControllers phù hợp với một trong những điều khiển xem của bạn và nếu nó tồn tại của khóa học. Trong trường hợp này là trường hợp đầu tiên (trong mảng và bảng phân cảnh).

Không được đính kèm segue ("LoginScreen") vào một hành động. Cách bạn thực hiện điều này là bằng cách kéo điều khiển từ biểu tượng chủ sở hữu tệp ở cuối cảnh kịch bản tới cảnh đích. Một cửa sổ bật lên sẽ xuất hiện sẽ yêu cầu một tùy chọn trong “Phân đoạn thủ công”; chọn “Push” làm loại. Nhấn vào hình vuông nhỏ và đảm bảo bạn đang ở trong Thanh tra thuộc tính. Cung cấp cho nó một định danh mà bạn sẽ sử dụng để tham chiếu đến nó trong mã.

Các vấn đề liên quan