是否可以在Objective-C中声明Delegates之类的匿名实现.我想我的术语是正确的,但这是一个java示例:
myClass.addListener(new FancyInterfaceListener({ void onListenerInterestingAction(Action a){ ....interesting stuff here } });
因此,例如,处理一个UIActionSheet调用我必须声明另一个方法在同一个班,如果我想通过它的数据,这似乎有点傻,因为我必须将这些数据保存为一个全局变量.以下是使用确认对话框删除内容的示例,询问您是否确定:
-(void)deleteItem:(int)indexToDelete{ UIActionSheet *confirm = [[UIActionSheet alloc] initWithTitle:@"Delete Item?" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:nil]; [confirm showInView:self.view]; [confirm release]; }
和同一类中的UIActionSheetDelegate:
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 0){ [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/]; [drinksTable reloadData]; } }
我想要做的是将其声明为内联,就像我在顶部的java示例中所做的那样.这可能吗?
目前在Objective-C中无法做到这一点.Apple已经发布了一些关于他们为该语言添加块(实际上更像是lambda闭包而不是匿名类)的工作.你可能会做一些类似于匿名委托的事情.
与此同时,大多数Cocoa程序员将委托方法添加到委托类的单独类别中.这有助于保持代码更有条理.在您的示例中的类的.m文件中,我会这样做:
@interface MyClass (UIActionSheetDelegate) - (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex; @end @implementation MyClass //... normal stuff here @end @implementation MyClass (UIActionSheetDelegate) - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 0){ [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/]; [drinksTable reloadData]; } } @end
编辑器窗口中的Xcode方法弹出窗口将类别的声明和实现与主类分开.