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之外声明(您声明的是全局变量)。