2013-06-12 26 views
7

Làm thế nào để đạt được công cụ này dưới đây? Xin vui lòng cho tôi một số hướng dẫn cho nó. Tôi mô tả vấn đề của tôi bên dưới.iOS: có thể mở chế độ xem trước đó sau khi gặp lỗi và khởi chạy lại ứng dụng không?

Khi tôi nhấn nút trang chủ và xóa ứng dụng khỏi khay và trong khi tôi đang mở ứng dụng, tôi nhận được màn hình đăng nhập. Tôi biết cách sử dụng tốt NSUserDefaults.

Nhưng vấn đề của tôi là khi tôi điều hướng 3rd hoặc 4th viewController và tôi nhấn nút Home và xóa ứng dụng khỏi khay, Sau đó, bất cứ khi nào tôi mở ứng dụng hơn tôi muốn mở với lần mở viewController cuối cùng.

Cũng giống như khi ứng dụng của tôi bị lỗi và tôi mở lại lần nữa thì tôi muốn mở ứng dụng với trạng thái mở lần cuối viewController.

Vì vậy, tôi chỉ muốn biết điều đó là có thể hay không? Nếu có, xin vui lòng hướng dẫn tôi làm thế nào để đạt được công cụ này.

Cảm ơn bạn

Trả lời

2

tôi hiểu bạn là ok với phần mã để tôi sẽ chỉ cung cấp gợi ý của tôi

trên viewDidLoad của mỗi bộ điều khiển xem đặt một giá trị nsuserdefault của đối tượng hầu hết các hàng đầu trên mảng hàng hải.

nếu họ không quá nhiều chi nhánh sau đó bạn có thể quản lý việc đẩy mạnh ở bộ điều khiển xem gốc dễ dàng

+0

nhờ trả lời ý tưởng của bạn là tốt, nhưng tôi lo lắng bout làm thế nào để quản lý tất cả các ứng dụng của tôi với navigaiton + tabbar và cũng có hai loại quản trị đăng nhập và sử dụng ..? Vậy làm thế nào để quản lý điều này cộng với LoginScreen ... và phiên và người dùng liên quan của nó ..? –

+0

Woohh tôi nghĩ bạn sẽ phải tạo một lớp (được tuần tự hóa) và sau đó trong đó lưu tất cả các thông tin cần thiết như loại tài khoản, chỉ mục tab, viewcontroller. lưu nó trong mặc định của người dùng như nsdata – amar

3

, cả hai trường hợp có thể xảy ra.

Khi gặp sự cố, bạn có thể sử dụng UncaughtExceptionHandler để thực hiện một số mã. Trong bạn đại biểu ứng dụng, đăng ký, bạn xử lý như thế này:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
// Other didFinishLaunchingWithOptions code 

Và thêm phương pháp xử lý của mình vào cùng một tập tin .m

void uncaughtExceptionHandler(NSException *exception) 
{ 
    // App crashed, save last selected tabbar index to the to the NSUserDefaults 
    [[NSUserDefaults standardUserDefaults] setInteger:tabBarController.selectedIndex forKey:@"LastSelectedTabbarIndex"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Trong khi ứng dụng chạy, để theo dõi các thanh tab chọn cuối cùng điều khiển, sử dụng UITabBarControllerDelegate và lưu chỉ mục của thanh tab mới được chọn thành NSUserDefaults. Ví dụ ngắn:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    NSUInteger tabIndex = [[tabBarController viewControllers] indexOfObject:viewController]; 

    // I have newly selected index, now save it to the NSUserDefaults 
} 

Mã này sẽ lưu chỉ mục của thanh tab được chọn cuối cùng vào số NSUserDefaults thay đổi chỉ mục được chọn của thanh tab mỗi lần. chỉ số chọn

Cuối cùng, khi bạn ứng dụng bắt đầu (trong didFinishLaunchingWithOptions của bạn), đọc qua lưu chỉ số thanh tabbar từ NSUserDefaults và thiết lập thanh tabbar của phù

self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults; 

Edit: Nếu bạn cũng cần phải khôi phục UINavigationController s điều khiển ngăn xếp, nhiệm vụ khá khó khăn của nó. Tôi cung cấp cho bạn chỉ là một tổng quan nhanh chóng những gì đến với tâm trí của tôi.

Có 2 trường hợp:

  • Bạn có tùy chỉnh xem điều khiển initializers và cần phải vượt qua tùy chỉnh đối tượng cho những bộ điều khiển - Trong trường hợp này, nó gần không thể (trong một số thời gian hợp lý) thực hiện điều này
  • Bạn chỉ sử dụng -init hoặc -initWithNibName...: để khởi tạo bộ điều khiển chế độ xem trong ngăn điều hướng. Bạn có thể liệt kê các bộ điều khiển từ thư mục gốc UINavigationController của tab, nhận tên lớp học bằng cách sử dụng NSStringFromClass và lưu chúng vào NSUserDefaults. Trên các ứng dụng bắt đầu, bạn sẽ đảo ngược thủ tục (khởi tạo bộ điều khiển bằng cách sử dụng các chuỗi tên của chúng được đọc từ NSUserDefaults sử dụng một cái gì đó như thế này: UIViewController *vc = [[NSClassFromString(@"aa") alloc] init];).
+0

nhưng những gì về trong khi i m trong điều hướng Tabbarviewcontroller -> anotherVIewcontroller ..? –

+0

thx để biết thông tin nhưng ý tưởng của bạn là tốt nhưng tôi lo lắng về cách quản lý tất cả ứng dụng này với navigaiton + tabbar và cũng có hai loại quản trị viên đăng nhập và sử dụng ..? Vậy làm thế nào để quản lý điều này cộng với LoginScreen ... và phiên và người dùng liên quan của nó ..? –

+0

Xin lỗi, nhưng Im không thể giúp bạn nhiều hơn hoặc chi tiết hơn: -/Giải pháp có thể phụ thuộc mạnh vào kiến ​​trúc ứng dụng của bạn, tôi hy vọng bạn hiểu rằng :-) –

2

Đây không phải là câu trả lời đúng nhưng bạn có thể sử dụng câu trả lời này để điều hướng chế độ xem sau khi khởi chạy.

Trong sử dụng tập tin appdelegate dưới mã: ---

#import "NewSAppDelegate.h" 
#import "NewSViewController.h" 

static NewSAppDelegate *globalSelf; 

@implementation NewSAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.viewController = [[NewSViewController alloc] initWithNibName:@"NewSViewController" bundle:nil]; 
    self.navController=[[UINavigationController alloc] initWithRootViewController:self.viewController]; 
    self.window.rootViewController = self.navController; 
    [self.window makeKeyAndVisible]; 
    globalSelf=self; 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

    return YES; 
} 

void uncaughtExceptionHandler(NSException *exception) 
{ 
    UIViewController *currentVC = globalSelf.navController.visibleViewController; 
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"]; 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIViewController *currentVC = self.navController.visibleViewController; 
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil]; 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
} 

Trong đăng nhập phương pháp init viewController của bạn thêm một người quan sát để thông báo và trong phương pháp thông báo, bạn có thể áp dụng nếu điều kiện cho đẩy tên received.and viewController để rằng viewController trên tung ra bộ điều khiển LoginView như: ---

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 

     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(openLastVC) 
                name:@"appDidBecomeActive" 
                object:nil]; 

     // Custom initialization 
    } 
    return self; 
} 

-(void)openLastVC 
{ 
    NSLog(@"val ==%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"]); 

    if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"] isEqualToString:@"GhachakViewController"]) { 
     GhachakViewController *gvc=[[GhachakViewController alloc] initWithNibName:@"GhachakViewController" bundle:nil]; 
     [self.navigationController pushViewController:gvc animated:NO]; 
    } 
} 

có thể điều này giúp bạn ....

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