Objective c 如何为1个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

我想以编程方式创建一个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);
      }

  });
}

我列出了一些方法,以查看第二个方法是否在运行时添加到实例中,并且它是否在列表中

但是,第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的方法。你把这两个人搞糊涂了。