我试图在我的块调用中创建视图控制器,当它从块返回时,我的对象变为零。如何解决?
我的封锁声明:
typedef void (^GetViewController)(UIViewController *viewController, int index);
在需要VC时调用块(viewController现在为nil)
self.getViewController(viewController, index);
在另一个类中设置VC
self.myController.getViewController = ^(UIViewController *viewController, int index)
{
switch (index) {
case Option1:
viewController = [[Option1VC alloc] init];
break;
case Option2:
viewController = [[Option1VC alloc] init];
break;
default:
break;
}
//at this point VC is created
};
答案 0 :(得分:4)
您的块正在修改传递给它的参数。参数按值传递,因此更改的值将被丢弃。
为什么不让块返回视图控制器作为块结果?这样编译器应该生成代码,使其保持活动状态,直到调用者有机会将结果分配给强变量。
答案 1 :(得分:1)
指向指针的指针是一个选项,即
typedef void (^GetViewController)(UIViewController** viewController, int index);
...
self.myController.getViewController = ^(UIViewController** viewController, int index)
{
*viewController = nil; // Avoid random value
switch (index) {
case Option1:
*viewController = [[Option1VC alloc] init];
break;
case Option2:
*viewController = [[Option1VC alloc] init];
break;
default:
break;
}
//at this point VC is created
};
答案 2 :(得分:0)
您可以对变量使用__block存储类型修饰符来修改块中的它们。如果没有此修饰符,则变量在块的范围内是只读的。这可以让你绕过值传递参数。