Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 实现UIViewController类别_Iphone_Objective C_Ios_Cocoa Touch - Fatal编程技术网

Iphone 实现UIViewController类别

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;

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

在my.h中:

@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。