0

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

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

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

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

还有他们:

#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 书籍中找到很多内容来帮助我解决这个问题。我对“发送到实例的无法识别的选择器”的可能原因有一个大致的了解,但我不确定如何在此处应用该修复程序。我提前感谢我可能收到的任何帮助,如果我没有正确格式化或提供足够/相关信息,我也深表歉意,因为这是我的第一篇文章!

4

1 回答 1

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

于 2013-05-24T15:57:20.513 回答