目标C获取pickerview值

时间:2011-06-06 14:28:56

标签: iphone objective-c xcode uipickerview

另一个Objective-C适合你,可能非常明显,但我已经在这几天了,并且在这里和其他地方拖网遇到类似的问题后无法让它工作!

我几乎有一个5段拾取器,当点击一个按钮时,会显示一个警报表,一旦接受就会抓取拾取器轮的值。很简单,但我不能让它工作,我不知道我哪里出错...下面的一些代码...它可能很糟糕......但这对我来说都很新,所以任何帮助都会是赞赏。所有这些都是在不使用InterfaceBuilder的情况下完成的。

在动作表工作正常后,一切都进入循环......我只是无法获取值!

(ps,我希望格式化工作正常!我已经改变了一些我的命名,但一切都应该是正确的)

谢谢!

MyFile.h

@interface MyViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource, UIActionSheetDelegate>
{
    UIPickerView * thePickerView;
    NSArray *thePickerValues;
}
@property (nonatomic, retain) UIPickerView *thePickerView;
@property (nonatomic, retain) NSArray *thePickerValues;

- (void)buildPicker;
- (void)doAction;

@end

MyFile.m

@implementation MyViewController
@synthesize thePickerView;
@synthesize thePickerValues;

- (void)viewDidLoad
{
    NSArray *values = [[NSArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",nil];
    thePickerValues = values;
    [values release];
    [self buildPicker];
}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 5;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [self.thePickerValues count];
}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [self.thePickerValues objectAtIndex:row];
}

-(void)buildPicker
{
    CGRect pickerFrame = CGRectMake(0.0f,130.0f,320.0,100.0f);
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.delegate = self;
    pickerView.showsSelectionIndicator = YES;
    [self.view addSubview:pickerView];
    [pickerView release];
}



- (void)doAction
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                  initWithTitle:[NSString stringWithFormat:@"Blah blah"]
                                  delegate:self
                                  cancelButtonTitle:@"No!"
                                  destructiveButtonTitle:@"Yes!"
                                  otherButtonTitles:nil];
    [actionSheet showInView:self.parentViewController.tabBarController.view];
    [actionSheet release];
}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    if(!(buttonIndex == [actionSheet cancelButtonIndex]))
    {
        NSLog(@"Get the picker values");
        for(int i = 0; i<5;i++)
        {
            NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];
            NSLog(@"Wheel : %i Value : %i", i, selectedValue);
            [selectedValue release];
        }
    }
}

4 个答案:

答案 0 :(得分:1)

在这一行:

NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];

您应该知道NSInteger只是int的名称(实际上,基础类型取决于操作系统,但它始终是具体类型而不是Objective C对象)。换句话说,它不是一个指针。尝试:

NSInteger selectedValue = [thePickerView selectedRowInComponent:i];

我很惊讶你没有得到关于此的编译器警告。

答案 1 :(得分:1)

另一种答案:thePickerView为零。我没有看到你为它分配一个值,对吗?

答案 2 :(得分:0)

NSInteger不是对象。这是简单的旧数据。现在查看它的定义。继续,命令 - 双击源文件中的符号。或者选项 - 双击以在参考手册中查找。

这应该这样做。

NSInteger selectedValue = [thePickerView selectedRowInComponent:i];
NSLog(@"Wheel : %i Value : %i", i, selectedValue);
// [selectedValue release];

答案 3 :(得分:0)

正如其他人所指出的,NSInteger不是一个对象。

NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];

此行中发生的事情是selectedRowInComponent:返回一个数字,表示所选行的索引。因为您将其分配给NSInteger 指针,所以计算机将该值用作内存地址。 (当您声明Whatever *foo表示foo包含内存地址时,*foo是该地址的值。)

如果您尝试取消引用(获取指向的值)selectedValue,您的应用可能会崩溃。或者更糟糕的是,不会崩溃,并返回任意地址的任何垃圾。

更重要的是,您正在混合方法返回的内容(索引)与您想要的内容(值)。

以下是您的需求:

NSInteger selectedRow = [thePickerView selectedRowInComponent:i];
NSString *selectedValue = [thePickerValues objectAtIndex:selectedRow];

现在你已经在selectedValue得到了你想要的东西,并且可以把它放在你的行动表中。