我正在尝试在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
。但我刚刚学习了类别和扩展,我认为可能更容易实现一个类别,它允许我从我所在的任何视图访问容器视图,而不是在每个视图控制器上都有属性。这是我第一次,所以我确定我的类别实现有问题,只是不确定它是什么。
答案 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中的句柄将是最后一个分配的句柄。