在我的应用程序中,我有一个UIViewController
我使用了很多UIAlertView
向用户提问。
因为我需要每个UIAlertView
的响应我已经使我的控制器成为UIAlertViewDelegate
的委托,这样可以正常工作但是在UIAlertView
之后我想要找到更好的方法使用代表。
在java中我知道我可以为一个目的创建内联类,就像这个问题:Java - inline class definition
我想知道的是:有没有办法创建一个动态委托的类?实现这样的目标
id<UIAlertViewDelegate> myCustomClass = @class {
my class code goes here
}
UIAlertView* alertView;
alertView = [[UIAlertView alloc] initWithTitle:@"Title"
message:@"Message"
delegate:myCustomClass
cancelButtonTitle:@"No"
otherButtonTitles:@"OK", @"Sure", @"Maybe", nil] ];
[alertView show];
答案 0 :(得分:14)
不 - Objective-C中没有'内联类'。话虽如此,您可以使用objective-c在运行时创建自定义对象,这需要更多一些,但我愿意分享一些代码来做您所说的。
以下是一个例子:
<强> NSObject的+ Subclass.h 强>
#import <objc/runtime.h>
typedef struct selBlockPair { SEL aSEL; id (^__unsafe_unretained aBlock)(id, ...); } selBlockPair;
#define NIL_PAIR ((struct selBlockPair) { 0, 0 })
#define PAIR_LIST (struct selBlockPair [])
#define BLOCK_CAST (id (^)(id, ...))
@interface NSObject (subclass)
+(Class) newSubclassNamed:(NSString *) name
protocols:(Protocol **) protos
impls:(selBlockPair *) impls;
@end
<强> NSObject的+ Subclass.m 强>
@implementation NSObject (subclass)
+(Class) newSubclassNamed:(NSString *)name
protocols:(Protocol **)protos
impls:(selBlockPair *)impls
{
if (name == nil)
{
// basically create a random name
name = [NSString stringWithFormat:@"%s_%i_%i", class_getName(self), arc4random(), arc4random()];
}
// allocated a new class as a subclass of self (so I could use this on a NSArray if I wanted)
Class newClass = objc_allocateClassPair(self, [name UTF8String], 0);
// add all of the protocols untill we hit null
while (protos && *protos != NULL)
{
class_addProtocol(newClass, *protos);
protos++;
}
// add all the impls till we hit null
while (impls && impls->aSEL)
{
class_addMethod(newClass, impls->aSEL, imp_implementationWithBlock(impls->aBlock), "@@:*");
impls++;
}
// register our class pair
objc_registerClassPair(newClass);
return newClass;
}
@end
使用示例:
int main()
{
@autoreleasepool {
__strong Class newClass = [NSString newSubclassNamed:@"MyCustomString" protocols:NULL impls: PAIR_LIST {
@selector(description),
BLOCK_CAST ^id (id self) {
return @"testing";
},
NIL_PAIR
}];
NSString *someString = [newClass new];
NSLog(@"%@", someString);
}
}
输出:
2012-10-01 10:07:33.609 TestProj[54428:303] testing
答案 1 :(得分:3)
这种类型的Java匿名内部类不是Objective-C支持的东西。如果你想单独回答代表,我很好的方法是尝试使用块。
不幸的是,Apple没有在UIAlertViews中添加块,但您可以自己实现它们。一群人在网上完成了这项工作。请看这里:http://blog.mugunthkumar.com/coding/ios-code-block-based-uialertview-and-uiactionsheet/或https://github.com/MugunthKumar/UIKitCategoryAdditions。
基本思想是你可以创建一个子类(或者如果使用关联对象的类别),它将是它自己的委托并告诉它自己的委托调用你传入的块