Objective c 如何为1个pickerView实例替换pickerView:numberOfRowsInComponent方法
我想以编程方式创建一个pickerView,并让它使用自己版本的方法,比如pickerView:numberOfRowsInComponent 我在运行时创建实例,如下所示:Objective c 如何为1个pickerView实例替换pickerView:numberOfRowsInComponent方法,objective-c,uipickerview,method-swizzling,Objective C,Uipickerview,Method Swizzling,我想以编程方式创建一个pickerView,并让它使用自己版本的方法,比如pickerView:numberOfRowsInComponent 我在运行时创建实例,如下所示: UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)]; myPickerView.delegate = self; myPickerView.dataSource = self; myPi
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);
}
});
}
我列出了一些方法,以查看第二个方法是否在运行时添加到实例中,并且它是否在列表中
但是,第2个方法不运行,第1个方法运行
这里有一个链接,是我开始写这篇文章的,我已经确认它是有效的,但我似乎遗漏了一些东西。
我愿意接受其他建议,我试图解决的问题是,我想创建一个UIPickerView对象的实例,它不依赖于同时运行的另一个实例。所以我想要一个不同的方法,它只对一个实例起作用,而完全忽略可能正在运行的任何其他实例,并且我想要以编程的方式来实现这一点
至少不使用标记/开关的一个原因是,在运行时之前我不知道条件是什么
我不知道为什么swizzle会处理一个对象而不是另一个,我也愿意用其他方法在运行时替换stock方法
我正在尝试替换的方法是否存在某些不允许替换的地方
编辑:为了尝试澄清问题,链接中的以下代码起作用。它将一种方法转换为另一种方法。我需要做的是对另一个对象做同样的事情,我不知道它对一个对象而不是另一个对象起什么作用
这适用于另一个对象:
这里还有另一个链接:一个简单的方法是在属性中保留指针的副本,然后比较datasource/delegate方法中的指针
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if ( pickerView == self.myPickerView )
return 1; // response for this particular picker view
else
return 5; // standard response
}
或者可能是使用标签或其他独特的方式来识别选择器,因为在这种情况下,swizzling似乎太麻烦了……我以前使用过这种方法,你是对的,它可以在大多数情况下完成工作,但我需要的是让pickerView运行标准方法以外的其他方法。swizzle方法将一个方法替换为另一个方法,如上面的链接所示,我只需要找出为什么它适用于一个对象而不是另一个对象。它适用于UIView,但不适用于UIPickerView。我想知道我是否必须将UIPickerView 1st子类化。也许我走错了路。这就是我想要做的:创建一个类的多个实例,即UIPickerView,这样该类的每个实例都有自己的方法。当它现在工作时,他们共享方法,我希望他们有自己独特的方法。它们将在运行时创建,每个方法使用的代码将在运行时确定。UIPickerViewDataSource协议有一个名为pickerView:numberOfRowsInComponent的方法。你把这两个人搞糊涂了。