2009-04-07 36 views
5

Tôi có một câu hỏi khác về khôi phục trạng thái ứng dụng, trên iPhone. Dữ liệu đơn giản (như tab đã chọn) có thể được lưu trữ trong NSUserDefaults, nhưng không đủ.Một câu hỏi khác về trạng thái ứng dụng iPhone

Tôi muốn khôi phục toàn bộ tiểu bang, bao gồm Bộ điều khiển Điều hướng (chuyển đến Trình điều khiển Chế độ xem phụ phụ).

Vấn đề của tôi là ứng dụng của tôi được chia thành nhiều tệp xib, vì vậy lúc đầu, tất cả các Bộ điều khiển chế độ xem không được khởi tạo. Có cách nào để "ép buộc" sự xúi giục từ một tập tin xib không?

(Tôi không có mã dưới bàn tay, nhưng tôi có thể cố gắng để viết một đầu nhỏ nếu nó không phải là rõ ràng)

Thanks a lot.

Trả lời

5

Calling [viewController view] sẽ đảm bảo rằng XIB một cái nhìn khiển trao tặng được tải, một khi nó là, bạn có thể sử dụng bất kỳ tài sản khác của nó thường

đây là những gì tôi có xu hướng để làm:

@class Record; // some model object--I assume it has an integer record ID 
@class DetailViewController; 

@interface RootViewController : UIViewController { 
    IBOutlet DetailViewController * detailController; 
} 

- (void)restore; 
... 
@end 

@implementation RootViewController 

// Note: all detailController showings--even ones from within 
// RootViewController--should go through this method. 
- (void)showRecord:(Record*)record animated:(BOOL)animated { 
    [self view]; // ensures detailController is loaded 

    [[NSUserDefaults standardUserDefaults] setInteger:record.recordID 
               forKey:@"record"]; 
    detailController.record = record; 

    [self.navigationController pushViewController:detailController 
             animated:animated]; 
} 

- (void)restore { 
    int recordID = [[NSUserDefaults standardUserDefaults] integerForKey:@"record"]; 

    if(recordID) { 
     Record * record = [Record recordWithID:recordID]; 
     [rootViewController showRecord:record animated:NO]; 
     // If DetailViewController has its own state to restore, add this here: 
     // [detailController restore]; 
    } 
} 
... 
- (void)viewDidAppear:(BOOL)animated { 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"record"]; 
} 
@end 

@implementation MyAppDelegate 

- (void)applicationDidFinishLaunching:(UIApplication*)application { 
    ... 
    [rootViewController restore]; 
    ... 
} 
... 
@end 

Mỗi cấp độ của hệ thống phân cấp view sẽ chăm sóc của tiết kiệm nhà nước riêng của mình, vì vậy bộ điều khiển ứng dụng không nhất thiết phải biết về tất cả các quan điểm có thể và đó đơn đặt hàng mà họ có thể ở trong.

+0

Nó có vẻ là giải pháp hoàn hảo, tôi sẽ kiểm tra càng sớm càng tốt. Cảm ơn ! –

+0

Tải tất cả các bộ điều khiển về khái niệm khởi động ngắt tải chúng một cách lười biếng, tăng thời gian khởi động ứng dụng và sử dụng bộ nhớ. – Kornel

+0

Nó không tải tất cả các bộ điều khiển vì bộ điều khiển con không được nạp trừ khi siêu điều khiển có ID bản ghi cho nó. –

4

Tôi làm điều này trong ứng dụng của mình, Biểu đồ Litho. Nếu bạn đang ở trên một trang khi bạn thoát, thì lần sau khi bạn khởi chạy, nó sẽ giúp bạn khôi phục trang đó. Nó cũng khá dễ dàng: trong trình xem -viewDidLoad của trình điều khiển xem chính của tôi, tôi kiểm tra xem trang cuối cùng đã được xem trong các giá trị mặc định của người dùng chưa. Nếu không có gì, tôi tiếp tục như bình thường (và hiển thị danh sách tất cả các trang). Nếu có điều gì đó, tôi mở trang đó (đẩy bộ điều khiển xem mới vào ngăn điều khiển điều hướng).

Tải thực tế của bộ điều khiển chế độ xem rất đơn giản: tôi chỉ cần khởi tạo chúng. Mỗi lớp điều khiển xem của tôi đã ghi đè -init để gọi -initWithNibName: bundle: trên siêu, do đó, gọi + alloc và -init để tạo cá thể bộ điều khiển xem là đủ để tải nó từ tệp .xib thích hợp. Sau đó, như được mô tả ở trên, tôi đẩy nó lên ngăn xếp của bộ điều khiển điều hướng:

[self.navigationController pushViewController: controller animated: YES]; 

Bạn có thể làm điều này với nhiều lớp như bạn cần, nhưng nhớ rằng bạn có thể muốn đẩy chế độ xem bộ điều khiển không có hoạt ảnh nếu có nhiều chuyển tiếp; nó sẽ phản tác dụng cho người dùng phải chờ qua một vài hình ảnh động (:.

0

Nhìn vào mã mẫu "drilldownsave" táo. thực hiện chính xác những gì bạn muốn

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