Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIViewController在为零后保持状态_Objective C_Cocoa_Uiviewcontroller_Automatic Ref Counting - Fatal编程技术网

Objective c UIViewController在为零后保持状态

Objective c UIViewController在为零后保持状态,objective-c,cocoa,uiviewcontroller,automatic-ref-counting,Objective C,Cocoa,Uiviewcontroller,Automatic Ref Counting,在我的应用程序中,我创建了一个BookViewController类,用于显示一本书的页面并设置其动画;创建了一个MainMenuViewController类,用于显示一组用户可以阅读的书 在后一个类中,当用户点击其中一本书时,将调用一个函数,该函数应创建BookViewController的全新实例,但由于某种原因,该实例保持其状态(即从用户离开的页面恢复) 如果我把它设为零,这怎么可能呢?我错过了什么?(请注意,我使用的是ARC) MainMenuViewController.m @int

在我的应用程序中,我创建了一个
BookViewController
类,用于显示一本书的页面并设置其动画;创建了一个
MainMenuViewController
类,用于显示一组用户可以阅读的书

在后一个类中,当用户点击其中一本书时,将调用一个函数,该函数应创建
BookViewController
的全新实例,但由于某种原因,该实例保持其状态(即从用户离开的页面恢复)

如果我把它设为零,这怎么可能呢?我错过了什么?(请注意,我使用的是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];

}
@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;
}
BookViewController.h

@interface BookViewController : UIViewController
-(id)initWithBookTitle:(NSString *)bookTitle;
@end
BookViewController.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];

}
@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: 每次点击一本书时,都会调用
bookstapped:
,并且电子控制台总是打印:

2012-08-31 16:29:51.750 AppName[25713:c07]初始化BookView控制器,书名为book1

那么,如果正在创建一个新的
BookViewController
实例,它为什么会返回旧实例呢

编辑2: 我插入了
NSLog(@“bookViewController%@”,bookViewController)就在行
[自我呈现视图控制器: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>
2012-08-31 16:37:41.426亨利[25784:c07]图书视图控制器
2012-08-31 16:38:23.321亨利[25784:c07]bookViewController
2012-08-31 16:38:53.393亨利[25784:c07]bookViewController

我怀疑您使用的是IVAR而不是属性。请将
bookViewController
替换为
self.bookViewController

尝试:


在新实例中维护其状态的变量声明如下:

#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
方法中初始化它…有什么想法吗?

您的变量在类的@implementation之外声明(您正在声明全局变量).

看看一些
BookViewController
方法中会发生什么,这会很有趣,比如
initWithBookTitle:
viewDidLoad:
ViewWillDisplay:
。我编辑了我的问题,将
initWithBookTitle:
…BookViewView控制器的
viewDidLoad的代码包括在内e> 只需设置视图布局…我看到您在那里有一些可能有用的日志。您可以添加日志吗?请在[self-presentViewController:bookViewController动画:是完成:无]之前添加NSLog(@“bookViewController%@”,bookViewController%);并记录theBookTitle值。然后,问题似乎不是你在标题中说的话——你得到了正确的标题,日志显示了BookViewController的新实例。我认为问题在于“冗长乏味”你没有发布的代码的一部分。你应该在你实际展示这本书的地方放一个日志,以确保在你创建一个新的图书控制器时它会被调用。我不认为这对ARC有什么影响。你能解释一下你的想法吗?我试着用
self.bookViewControlle替换
bookViewController
r
问题仍然存在…@Steven,当我看到这个问题时,这只是一个很快的想法,它提醒了我ivar而不是属性的类似问题。因此,我同意在这种情况下,ARC将不会对ivar和属性调用产生任何区别。@Steven,在init方法cal期间,您对ivar赋值有什么看法l?事实上,我认为这是建议。但是我会使用自动合成或
@syntheticed bookTitle=\u bookTitle
来避免潜在的混淆。您的变量在类的@implementation之外声明(您声明的是全局变量)。