2010-02-14 20 views
7

Khi người dùng bắt đầu ứng dụng Tôi muốn nó hiển thị các stockholm.xib và Nó ở đây:Làm thế nào tôi có thể gọi ViewDidAppear chỉ một lần?

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 

    NSUserDefaults *startPage =[NSUserDefaults standardUserDefaults]; 
    NSString *page =[startPage stringForKey:@"page"]; 
    NSLog(page); 

    if(page==nil) 
    { 
     //Do nothing 

    } 
    else if ([page isEqualToString:@"Default"]) 
    { 
     //Do nothing 
    } 

    else if ([page isEqualToString:@"Stockholm"]) 
    { 
     NSLog(@"going to Stockholm"); 
     Stockholm *Start =[[Stockholm alloc]initWithNibName:nil bundle:nil]; 
     [self presentModalViewController:Start animated:YES]; 


    } 
    else { 
     NSLog(@"HAHA"); 

} 

nhưng khi người dùng đóng stockholm.xib sử dụng:

[self dismissModalViewControllerAnimated:YES]; 

sau khi hình ảnh động là đã xong, ứng dụng gặp sự cố. và lý do là, tôi đoán, viewDidAppear gọi hai lần và do đó, nó đang cố gắng mở tệp xib đã đóng gần đây.

bây giờ, làm cách nào tôi có thể gọi chế độ xem chỉ xuất hiện một lần? để khi người dùng quay trở lại từ Stockholm, viewDidAppear sẽ không được gọi? bất kỳ giải pháp nào khác?

thanx :)

Trả lời

14

Bạn có thể thử di chuyển tất cả những gì chức năng trong phương pháp viewDidLoad: thay vì viewDidAppear. Cái đó chỉ bắn một lần thôi. Trừ khi có lý do để bạn không ...?

EDIT: Mã hơn để hiển thị những gì tôi có nghĩa là trong các bình luận

trong file .h:

BOOL firstTime; 

trong file .m:

-(void)viewDidLoad { 
    NSLog(@"viewDidLoad actually fired"); 
    //... 
    firstTime = YES; 
} 
-(void)viewDidAppear { 
    //... 
    if(firstTime){ 
     //show it 
     firstTime = NO; 
    } 
} 
+0

có, lý do là nếu tôi di chuyển điều này: Stockholm * Bắt đầu = [[Stockholm alloc] initWithNibName: nil bundle: nil]; [self presentModalViewController: Bắt đầu hoạt ảnh: YES]; để viewdidLoad, nó sẽ không hoạt động. – hafhadg3

+1

Nếu bạn chỉ muốn hiển thị lần đầu tiên chế độ xem xuất hiện, chỉ cần sử dụng cờ boolean để biết đây có phải là lần đầu tiên hay không. BOOL firstTime = true; if (... && firstTime) {firstTime = false; ...} – Dimitris

+0

Nó vẫn không hoạt động. .h BOOL tĩnh firstTime = TRUE; .m - (void) viewDidAppear: (BOOL) hoạt ảnh { \t [super viewDidAppear: animated]; \t if (firstTime = TRUE) { \t \t // Tới tục Trang \t} \t firstTime = FALSE; } tôi nhận được lỗi này: 0x018ce464 <+0665> jne 0x18ce481 <- [UIWindowController transitionViewDidComplete: fromView: toView:] + 694> xin vui lòng giúp đỡ! – hafhadg3

6

Bạn có thể sử dụng GCD , nếu lớp học của bạn có một trường như:

@interface MyClass { 
    dispatch_once_t once; 
} 

@end 

@interface MyClass { 
    - (void)viewDidAppear:(BOOL)animated { 
     dispatch_once(&once, ^{ 
      // do business 
     }); 
    } 
@end 
+2

CHỈNH SỬA: Vẫn cần cờ. Sử dụng phương thức tĩnh sẽ có nghĩa là mã sẽ chạy chỉ một lần cho dù có bao nhiêu phiên bản của trình điều khiển chế độ xem được tạo. – ZaBlanc

+0

Đây là _seems_ như một ý tưởng hay, nhưng nó thực sự sẽ dẫn đến hành vi không xác định: 'Vị từ phải trỏ đến một biến được lưu trữ trong phạm vi toàn cục hoặc tĩnh. Kết quả của việc sử dụng vị từ với bộ nhớ tự động hoặc động là không xác định.' – datwelk

1

Bạn có thể thêm tài sản như BOOL nạp vào viewController của bạn, đặt nó là sai trong viewDidLoad, và sau đó thực hiện phương pháp viewDidAppear của bạn như:

- (void)viewDidAppear:(BOOL)animated { 
    if (!loaded) { 
     //code 
    } else { 
     return; 
    } 
    loaded = YES; 
} 

đó làm việc cho tôi.

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