【问题标题】:Why am I getting a different instance of a ViewController than the one I pushed onto the navigationController?为什么我得到的 ViewController 实例与我推送到 navigationController 上的实例不同?
【发布时间】:2010-07-02 17:53:13
【问题描述】:

为什么我会得到一个不同的 HistoryViewController 实例而不是我实例化并推送到 navigationController 上的实例?

创建的不同实例没有我设置的任何属性。

ProfileHomeViewController.m

HistoryViewController *historyViewController = nil;
historyViewController = [[HistoryViewController alloc] initWithNibName:@"HistoryViewController" bundle:nil];
// nib has identity of NSObject (I also tried HistoryViewController), and tableviewcontroller with identity HistoryViewController
historyViewController.profile = self.profile;

NSLog(@"%@ > %@", self, self.managedObjectContext);
// <ProfileHomeViewController: 0x5b34330> > <NSManagedObjectContext: 0x7918770>


historyViewController.managedObjectContext = self.managedObjectContext;
NSLog(@"%@ > %@", historyViewController, historyViewController.managedObjectContext);
// <HistoryViewController: 0x792a870> > <NSManagedObjectContext: 0x7918770>

[self.navigationController pushViewController:historyViewController animated:YES];
[historyViewController release];

HistoryViewController.h

@interface HistoryViewController : UITableViewController {

    NSManagedObject *profile;
    NSFetchedResultsController *fetchedResultsController;
    NSManagedObjectContext *managedObjectContext;

}

@property (nonatomic, retain) NSManagedObject *profile;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

HistoryViewController.m

@implementation HistoryViewController

@synthesize profile;
@synthesize fetchedResultsController;
@synthesize managedObjectContext;


- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"inside HistoryViewController %@ > profile %@", self, self.profile);
    // inside HistoryViewController <HistoryViewController: 0x7917750> > profile (null)

    NSLog(@"inside HistoryViewController %@ > managedObjectContext %@", self, self.managedObjectContext);
    // inside HistoryViewController <HistoryViewController: 0x7917750> > managedObjectContext (null)

    if(self.managedObjectContext == nil){
            NSLog(@"invalid managedObjectContext WTF");
            abort();
    }
}

【问题讨论】:

    标签: iphone objective-c uiviewcontroller uinavigationcontroller nsmanagedobjectcontext


    【解决方案1】:

    实例相同,对同一个实例的引用不同(这很好)。

    方法 viewDidLoad 被调用 你设置变量这就是 self.managedObjectContext == nil 的原因。

    要么编写一个自定义的 init 方法,它接受参数 history 和 managedobjectcontext 并将它们设置在 init 中。或者不使用 viewDidLoad,而是使用 viewWillAppear:animated...

    【讨论】:

    • 哦,我一运行viewDidLoad,它就运行initWithNibName?当我在调试器中单步执行时,viewDidLoad 直到我调用pushViewController 之后才执行。但是,将 fetchedResultsController 的 init 方法移到 viewWillAppear 中确实成功了!
    • 来自文档,“在视图控制器将其关联视图加载到内存后调用此方法”。所以是的,该方法在初始化阶段的某个时候被调用。
    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2020-01-11
    • 1970-01-01
    • 2021-06-07
    • 2019-06-22
    相关资源
    最近更新 更多