2012-03-25 64 views
2

我想实现我的MainContainerViewController类别返回主实例:实现一个UIViewController类

在我的.h:

@interface UIViewController(MainViewExtension) 
/** Convience method for getting access to the MainContainerViewController instance */ 
- (MainContainerViewController *)mainContainerExtension; 
@end 

在我的.m

@implementation UIViewController(MainViewExtension) 
- (MainContainerViewController *)mainContainerExtension 
{ 
    return (MainContainerViewController *)self; 
} 
@end 

所以从一些外部视图控制器,我做self.mainContainerExtension来访问实例,并且只声明了一个实例,但它没有给我正确的实例。

NSLog(@"number of children:%i", [self.mainContainerExtension.childViewControllers count]); 

这将返回0,即使它应该是3,所以这就是我知道它没有给我正确的结果。我错过了什么吗?

编辑:我知道这不会给我正确的实例的方式是因为在MainContainerViewControllerviewDidLoad,我有这样的:

- (void)viewDidLoad 
{ 
    appDelegate.notesViewController=[[NotesViewController alloc] init]; 
    appDelegate.notesViewController.mainContainer=self; 
    [self addChildViewController: appDelegate.notesViewController]; 
} 

每个NotesViewControllerMainContainerViewController类型的属性,从而使我总是有办法从NotesViewControllers访问MainContainerViewController。但是我刚刚了解了类别和扩展,并且我认为实现一个类别可以让我更方便地访问容器视图,而不是在每个视图控制器上都有属性。这是我第一次,所以我敢肯定,我在执行类别时做错了什么,只是不知道它是什么。

+0

你想完成一个单身?你能否粘贴一些显示失败比较的代码?也就是说,ExpectedHandleToVC!= self.mainContainerExtension。比较或NSLog(@“%p”,self)是测试其工作是否更直接的方法。 – danh 2012-03-25 14:38:23

+0

我对'NSLog(@%@“,self.mainContainerExtension)的输出是:''。不太确定这是什么意思,尽管 – Snowman 2012-03-25 14:45:28

+0

它是指向实例的指针。换句话说,是什么让你认为它是错的?典型的(非标签栏)UIViewController应该有0个childViewControllers。 – danh 2012-03-25 14:59:10

回答

0

我不认为实例方法返回自己可以是有用的。无论你要调用哪个对象:[someVC mainContainerExtension],你都已经有了答案:它是一些VC。

如果每个NotesViewController都有一个包含VC的属性,那么你是不是都设置了?只要是公开的NotesVC头:

MainContainerViewController *mainVC = [[MainContainerViewController] alloc] init ...]; 

// then, after the view loads 
for (UIViewController *vc in mainVC.childViewControllers) { 
    NSLog(@"%@", (NotesViewController *)vc.mainContainer); 
} 

还要注意,除非有只有一个应用NotesViewController,一个在的appDelegate得到分配将被覆盖。 appDelegate中的句柄将是最后一个分配的句柄。