首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何替换pickerView :1个pickerView实例的numberOfRowsInComponent方法

如何替换pickerView :1个pickerView实例的numberOfRowsInComponent方法
EN

Stack Overflow用户
提问于 2015-03-01 16:30:26
回答 1查看 330关注 0票数 0

我想以编程的方式创建一个pickerView,并让它使用自己版本的方法,比如pickerView:numberOfRowsInComponent。

我在运行时创建实例,如下所示:

代码语言:javascript
复制
UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
myPickerView.delegate = self;
myPickerView.dataSource = self;
myPickerView.showsSelectionIndicator = YES;
[self.view addSubview:myPickerView];

调用的标准方法为:

代码语言:javascript
复制
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    NSUInteger numRows = 5;
    return numRows;
}    

我想要做的是将这个标准方法替换为这个实例的另一个方法。

代码语言:javascript
复制
-(NSInteger)xxxpickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{ // special method for this instance only
    return 1;
}

我可以使用方法swizzle来做其他事情,但是我似乎不能让它与UIPickerView一起工作。

代码语言:javascript
复制
@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/

EN

回答 1

Stack Overflow用户

发布于 2015-03-01 17:30:26

一种简单的方法是在属性中保留指针的副本,然后比较数据源/委托方法中的指针。

代码语言:javascript
复制
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if ( pickerView == self.myPickerView )
        return 1;   // response for this particular picker view
    else
        return 5;   // standard response
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28791554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档