我有一个带回调的方法,如下所示:
- (void)doStuff:(void ^())callback
{
//Do a whole bunch of stuff
//Perform callback
callback();
}
我稍后会这样调用此方法:
[self doStuff:^{[self callbackMethod];}];
当没有数据要传递时,这很好用,但现在我需要在方法之间传递一些数据。
采取以下方法:
- (void)showAViewWithOptions:(int)options
在这个方法中,我显示了一个包含某些选项的视图,但是如果屏幕上已经有其他内容,我会调用该方法来隐藏它,并回调此方法。
所以实现看起来像这样。
- (void)hideOldView:(void ^())callback
{
//Hide all objects in _oldViews and set _oldViews = nil
callback();
}
- (void)showAViewWithOptions:(int)options
{
if(_oldViews != nil)
{
[self hideOldView:^(int options){[self showAViewWithOptions:options];}];
return;
}
//Show the new view
}
这会编译并运行没有问题,但options
在传递后会丢失其值。
坦率地说,它编译后让我感到惊讶,因为我认为它不会接受带参数的块。
例如,如果我拨打[self showAViewWithOptions:4];
,则会触发回调,options = -1730451212
。
如何将值options
绑定到块?或者更好的问题,这是不可能的,因为当我打电话给回调时:
callback();
我没有在括号中添加任何内容?
如果是这样的话,那么一个很好的后续问题就是:为什么这首先要编译?
答案 0 :(得分:3)
这应该有效:
- (void)showAViewWithOptions:(int)options
{
if(_oldViews != nil)
{
[self hideOldView:^(){
// Recursion doesn't feel right; be careful!
// Why can't whatever is being done by this call be done
// within this block?
[self showAViewWithOptions:options];
}];
return;
}
//Show the new view
}
答案 1 :(得分:0)
具有返回值和参数的块如下所示:
^ return_type (parameter1_type parameter1_name, parameter2_type parameter2_name, ...) {
do_stuff;
};
答案 2 :(得分:0)
你可以将vairable传递给方法...你在方法中调用的回调方法:
- (void)hideOldViewWithId:(float)f callback:(void (^)(float f))callback{
f = f + 2.0f;
callback(f);
}
然后致电
[self hideOldViewWithId:1.0f callback:^(float f) {
NSLog(@"callback with float: %f", f);
}];