Iphone 实现UIViewController类别
我正在尝试在MainContainerViewController上实现一个类别,该类别返回主实例: 在my.h中:Iphone 实现UIViewController类别,iphone,objective-c,ios,cocoa-touch,Iphone,Objective C,Ios,Cocoa Touch,我正在尝试在MainContainerViewController上实现一个类别,该类别返回主实例: 在my.h中: @interface UIViewController(MainViewExtension) /** Convience method for getting access to the MainContainerViewController instance */ - (MainContainerViewController *)mainContainerExtension;
@interface UIViewController(MainViewExtension)
/** Convience method for getting access to the MainContainerViewController instance */
- (MainContainerViewController *)mainContainerExtension;
@end
在我的电脑里
@implementation UIViewController(MainViewExtension)
- (MainContainerViewController *)mainContainerExtension
{
return (MainContainerViewController *)self;
}
@end
因此,从某个外部视图控制器,我使用self.mainContainerExtension访问该实例,并且只声明了一个实例,但它没有给我正确的实例
NSLog(@"number of children:%i", [self.mainContainerExtension.childViewControllers count]);
它返回0,即使它应该是3,所以我知道它没有给我正确的结果。我错过什么了吗
编辑:我知道它没有给我正确的实例是因为在MainContainerServiceController的viewDidLoad中,我有以下内容:
- (void)viewDidLoad
{
appDelegate.notesViewController=[[NotesViewController alloc] init];
appDelegate.notesViewController.mainContainer=self;
[self addChildViewController: appDelegate.notesViewController];
}
每个NotesViewController都有一个类型为MainContainerViewController的属性,因此我始终可以从NotesViewController访问MainContainerViewController。但我刚刚了解了类别和扩展,我认为实现一个类别可能更容易,它让我可以从我所在的任何视图访问容器视图,而不是在每个视图控制器上都有一个属性。这是我第一次,所以我肯定我的分类实现有问题,只是不确定它是什么。我不认为实例方法返回self有用。无论您在[someVC mainContainerExtension]上调用哪个对象,您都已经得到了答案:它是someVC 如果每个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中分配的NotesViewController。appDelegate中的句柄将是最后一个分配的句柄。我认为返回self的实例方法不会有用。无论您在[someVC mainContainerExtension]上调用哪个对象,您都已经得到了答案:它是someVC 如果每个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中分配的NotesViewController。appDelegate中的句柄将是最后一个分配的句柄。您是否正在尝试完成单例?你能粘贴一些显示比较失败的代码吗?也就是说,预期的Handletovc!=self.main容器扩展。比较或NSLog@%p,self是测试它是否工作的更直接的方法。我对NSLog@%@,self.mainContainerExtension的输出是:。我不太清楚这意味着什么,虽然它是指向实例的指针。你能记录下你的期望吗?换句话说,是什么让你认为这是错误的?一个典型的非选项卡栏UIViewController应该有0个ChildViewController。您正在尝试完成一个单例吗?你能粘贴一些显示比较失败的代码吗?也就是说,预期的Handletovc!=self.main容器扩展。比较或NSLog@%p,self是测试它是否工作的更直接的方法。我对NSLog@%@,self.mainContainerExtension的输出是:。我不太清楚这意味着什么,虽然它是指向实例的指针。你能记录下你的期望吗?换句话说,是什么让你认为这是错误的?典型的非选项卡栏UIViewController应具有0个ChildViewController。