- [PickerViewController superview]:无法识别的选择器发送到实例& TableView - > ViewController w / Picker View

时间:2013-05-24 15:30:35

标签: ios uitableview ios6 uipickerview uistoryboard

我是新手ios程序员,在从自定义UITableViewController场景推送到包含Picker View的自定义UIViewController场景并实现@required pickerview委托/数据源方法时遇到一些麻烦。

[我在这里有截图提供更多见解,但我没有代表发布图片。想象一个具有三个静态行的tableview控制器,每个行提供详细信息披露以推送到相应的选择器视图 - Image]

当我点击任何表格的披露指标时,问题就会在运行时发生。返回的错误是

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PickerViewController superview]: unrecognized selector sent to instance."

如上所述,LocationFilter是UITableViewController的子类,只包含标签和步进器的几个属性。

我的选择器视图控制器的代码如下:

#import <UIKit/UIKit.h>

@interface PickerViewController : UIViewController <UIPickerViewDataSource,UIPickerViewDelegate>
{
    NSArray *sectionCandidates;
    NSArray *bankCandidates;
    NSArray *positionCandidates;
}

@property (weak, nonatomic) IBOutlet UIPickerView *sectionPicker;
@property (weak, nonatomic) IBOutlet UIPickerView *bankPicker;
@property (weak, nonatomic) IBOutlet UIPickerView *positionPicker;
@property NSArray *sectionCandidates, *bankCandidates, *positionCandidates;

@end

和.m:

#import "PickerViewController.h"
#import "SlotMachine.h"

@implementation PickerViewController

@synthesize sectionCandidates, sectionPicker, bankCandidates, bankPicker, positionCandidates, positionPicker;

- (void)viewDidLoad
{
    [super viewDidLoad];
    sectionCandidates = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", nil];
    bankCandidates = [NSArray arrayWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", nil];
    positionCandidates = [NSArray arrayWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", nil];
}

// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //Handle Selection
}

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    switch ([pickerView tag])
    {
        case 0:
            return [sectionCandidates count];
        case 1:
            return [bankCandidates count];
        case 2:
            return [positionCandidates count];
        default:
            return 0;
    }
}

// returns the label for each row
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    switch ([pickerView tag])
    {
        case 0:
            return [sectionCandidates objectAtIndex:row];
        case 1:
            return [bankCandidates objectAtIndex:row];
        case 2:
            return [positionCandidates objectAtIndex:row];
        default:
            return @"Null";
    }
}

@end

不幸的是,在故障排除方面,选择器视图似乎没有得到太多详细的关注,因此我无法在SO或某些iOS书籍中找到太多帮助我解决此问题的内容。我对“无法识别的选择器发送到实例”的可能原因有一个总体概念,但我不确定这里的修复程序是如何应用的。我提前感谢我可能收到的任何帮助,如果我没有正确格式化或提供足够/相关信息,我也会道歉,因为这是我的第一篇文章!

1 个答案:

答案 0 :(得分:1)

在故事板中,我在每个视图选择器视图控制器中看到一个选择器视图,但是您在代码中声明了三个IBOutlet选择器视图。您需要将IB中的这三个视图控制器合并为一个内部有三个选择器视图,或者您需要创建三个单独的视图控制器子类,只有一个IBOutlet UIPickerView属性。

由于您已将这些选择器视图设置为属性,因此不需要这些标记。您可以通过检查选择器视图本身来更改标签的检查:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (pickerView == self.sectionPicker) {
        return [sectionCandidates count];
    }
    else if (pickerView == self.bankPicker) {
        return [bankCandidates count];
    }
    else if (pickerView == self.positionPicker) {
        return [positionCandidates count];
    }
    return 0;
}

您还需要对选择器视图数据源titleForRow:forComponent进行类似的更改。