我是新手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书籍中找到太多帮助我解决此问题的内容。我对“无法识别的选择器发送到实例”的可能原因有一个总体概念,但我不确定这里的修复程序是如何应用的。我提前感谢我可能收到的任何帮助,如果我没有正确格式化或提供足够/相关信息,我也会道歉,因为这是我的第一篇文章!
答案 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
进行类似的更改。