我想以编程的方式创建一个pickerView,并让它使用自己版本的方法,比如pickerView:numberOfRowsInComponent。
我在运行时创建实例,如下所示:
UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
myPickerView.delegate = self;
myPickerView.dataSource = self;
myPickerView.showsSelectionIndicator = YES;
[self.view addSubview:myPickerView];调用的标准方法为:
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
NSUInteger numRows = 5;
return numRows;
} 我想要做的是将这个标准方法替换为这个实例的另一个方法。
-(NSInteger)xxxpickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{ // special method for this instance only
return 1;
}我可以使用方法swizzle来做其他事情,但是我似乎不能让它与UIPickerView一起工作。
@implementation UIPickerView (Tracking)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(pickerView:numberOfRowsInComponent:);
SEL swizzledSelector = @selector(xxxpickerView:numberOfRowsInComponent:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});}
我已经列出了这些方法,以查看第二个方法是否在运行时添加到实例中,并且它在列表中。
但是,第二个方法不会运行,第一个方法会运行。
这里有一个让我开始写这篇文章的链接,我已经确认它是有效的,但我似乎遗漏了一些东西。http://nshipster.com/method-swizzling/
我对其他建议持开放态度,我试图解决的问题是,我想创建一个不依赖于同时运行的另一个实例的UIPickerView对象的实例。所以我想要一个不同的方法,它只对一个实例起作用,而完全忽略可能正在运行的任何其他实例,我想通过编程来做到这一点。
不使用标记/开关至少有一个原因,那就是我在运行之前不知道条件是什么。
我不知道为什么swizzle可以处理一个对象而不是另一个对象,我对在运行时用其他方法替换常用方法持开放态度。
我试图替换的方法有没有什么不允许被替换的地方?
编辑:为了尝试让问题变得清晰,链接中的以下代码起作用。它将一个方法替换为另一个方法。我需要做的是对另一个对象做同样的事情,我不知道它对一个对象和另一个对象是什么。
这适用于另一个对象:http://nshipster.com/method-swizzling/
这里还有另一个链接:http://blog.newrelic.com/2014/04/16/right-way-to-swizzle/
发布于 2015-03-01 17:30:26
一种简单的方法是在属性中保留指针的副本,然后比较数据源/委托方法中的指针。
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if ( pickerView == self.myPickerView )
return 1; // response for this particular picker view
else
return 5; // standard response
}https://stackoverflow.com/questions/28791554
复制相似问题