gpt4 book ai didi

objective-c - 在 objective-c 中创建自定义动态类

转载 作者:可可西里 更新时间:2023-11-01 03:37:18 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个 UIViewController,我使用了很多 UIAlertView 来向用户询问事情。

因为我需要每个 UIAlertView 的响应我已经让我的 Controller 成为 UIAlertViewDelegate 的委托(delegate),这工作正常但是在 7 UIAlertView 之后'我正在努力寻找一种更好的方式来使用委托(delegate)。

在 Java 中,我知道我可以为单一目的创建内联类,就像这个问题:Java - inline class definition

我想知道的是:有没有办法创建一个动态委托(delegate)的类?实现这样的目标

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];

最佳答案

不——在 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

关于objective-c - 在 objective-c 中创建自定义动态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com