实现UIViewController类

时间:2012-03-25 14:13:49

标签: iphone objective-c ios cocoa-touch

我正在尝试在MainContainerViewController上实现一个返回主实例的类别:

在我的.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]);

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

修改:我知道它没有给我正确的实例,因为在viewDidLoad的{​​{1}}中,我有这个:

MainContainerViewController

每个- (void)viewDidLoad { appDelegate.notesViewController=[[NotesViewController alloc] init]; appDelegate.notesViewController.mainContainer=self; [self addChildViewController: appDelegate.notesViewController]; } 都有一个NotesViewController类型的属性,因此我始终可以从MainContainerViewController访问MainContainerViewController。但我刚刚学习了类别和扩展,我认为可能更容易实现一个类别,它允许我从我所在的任何视图访问容器视图,而不是在每个视图控制器上都有属性。这是我第一次,所以我确定我的类别实现有问题,只是不确定它是什么。

1 个答案:

答案 0 :(得分:0)

我不认为返回self的实例方法很有用。无论您调用哪个对象:[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中的句柄将是最后一个分配的句柄。