0

私のアプリでBookViewControllerは、本のページを表示してアニメーション化するMainMenuViewControllerクラスと、ユーザーが読むことができる本のセットを表示するクラスを作成しました。

後者のクラスでは、ユーザーが書籍の 1 つをタップすると、 の完全に新しいインスタンスを作成する関数が呼び出されますBookViewControllerが、何らかの理由でインスタンスはその状態を維持します (つまり、ユーザーが中断したページから再開します)。

nilに設定するとどうなりますか?ここで何が欠けていますか?(私はARCを使用していることに注意してください)。

MainMenuViewController.m

@interface MainMenuViewController ()
@property (strong) BookViewController *bookViewController;
@end

@implementation MainMenuViewController
@synthesize bookViewController;

-(void)bookTapped:(UIButton *)sender{

    NSString *bookTitle;

    if(sender == book1button) bookTitle = @"book1";
    else if(sender == book2button) bookTitle = @"book2";

    bookViewController = nil;

    bookViewController = [[BookViewController alloc] initWithBookTitle:bookTitle];
    [self presentViewController:bookViewController animated:YES completion:nil];

}

BookViewController.h

@interface BookViewController : UIViewController
-(id)initWithBookTitle:(NSString *)bookTitle;
@end

BookViewController.m

@implementation BookViewController
-(id)initWithBookTitle:(NSString *)theBookTitle{
    self = [super init];
    if(self){
        bookTitle = [NSString stringWithFormat:@"%@", theBookTitle];
        [self setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
        NSLog(@"init a BookViewController with bookTitle: %@", bookTitle);
    }
    return self;
}

編集1:bookTapped:本がタップされ、呼び出され、コンソールが常に出力 するたびに:

2012-08-31 16:29:51.750 AppName[25713:c07] init a BookViewController with bookTitle: book1

の新しいインスタンスBookViewControllerが作成されている場合、なぜ古いインスタンスが返されているように見えるのでしょうか?

編集 2:NSLog(@"bookViewController %@",bookViewController); 行の直前 に挿入 しました[self presentViewController:bookViewController。コンソール出力は次のとおりです。

2012-08-31 16:37:41.426 Henry[25784:c07] bookViewController <BookViewController: 0x6a21540>
2012-08-31 16:38:23.321 Henry[25784:c07] bookViewController <BookViewController: 0xe425540>
2012-08-31 16:38:53.393 Henry[25784:c07] bookViewController <BookViewController: 0x6839330>
4

3 に答える 3

1

変数は、クラスの@implementationの外部で宣言されます(グローバル変数を宣言しています)。

于 2013-01-28T20:31:29.427 に答える
0

新しいインスタンスで状態を維持していた変数は、次のように宣言されました。

#import "BookViewController.h"

int currentPage = 0;

@implementation BookViewController

-(id)initWithBookTitle:(NSString *)theBookTitle{
...

そのため、init メソッドで変数を初期化することで問題を解決できました。

-(id)initWithBookTitle:(NSString *)theBookTitle{
    self = [super init];
    if(self){
        currentPage = 0; //added this line
        bookTitle = [NSString stringWithFormat:@"%@", theBookTitle];
        [self setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];

         NSLog(@"init a BookViewController with bookTitle: %@", bookTitle);
    }
    return self;
}

しかし、これは根本的な問題を解決しません:

bookViewController = [[BookViewController alloc] initWithBookTitle:bookTitle];
[self presentViewController:bookViewController animated:YES completion:nil];

currentPage!の古い値を持つ bookViewController を引き続き提示します。これは、プロパティとして宣言しておらず、initメソッドで初期化していないためかもしれません...何か考えはありますか?

于 2012-09-03T14:17:08.127 に答える
0

プロパティの代わりに ivar を使用していると思われます。に置き換えbookViewControllerてくださいself.bookViewController

試す:

if(self){
        self.bookTitle
于 2012-08-31T15:22:29.513 に答える