【问题标题】:Objective C getting pickerview valuesObjective C获取pickerview值
【发布时间】:2017-02-07 16:41:14
【问题描述】:

为您准备的另一个 Objective-C,可能很明显,但我已经在这几天了,在在这里和其他地方搜索类似问题后无法让它工作!

我几乎有一个 5 段选择器,当单击按钮时,会显示一个警报表,一旦被接受,它就会抓取选择器轮的值。容易吧,但我无法让它工作,我不确定我哪里出错了......下面的一些代码......它可能很糟糕......但这对我来说都很新,所以任何帮助都是赞赏。顺便说一句,这一切都是在不使用 InterfaceBuilder 的情况下完成的。

操作表之后的所有循环都可以正常工作...我就是无法获取值!

(ps,我希望格式有效!我已经更改了一些命名,但一切都应该是正确的)

谢谢!

我的文件.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

我的文件.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];
        }
    }
}

【问题讨论】:

  • 好吧,玩了一会儿,我开始认为我没有连接到选择器。例如,我已经移动了代码以将值放入它自己的操作中,该操作在该循环中被调用。我还临时将数组更改为 a、b、c 等。结果似乎表明,无论您选择什么,它都只是将 selectedRowInComponent 设置为 0 还有其他想法吗?

标签: iphone objective-c xcode uipickerview


【解决方案1】:

另一种答案:thePickerView 为零。我没有看到你给它赋值,对吧?

【讨论】:

  • 可能,我 认为 我在这里赋值... -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger )component { return [self.thePickerValues objectAtIndex:row]; }
  • 我认为史蒂文是对的。如果thePickerView 为nil,则您发送给它的任何消息都将评估为nil 或0。您可能没有将视图连接到xib 文件中的插座。 (您可能必须声明属性 IBOutlet 才能显示。)
  • 在 buildPicker 中,只需将 pickerView 分配给 thePickerView:self.thePickerView = pickerView
【解决方案2】:

在这一行:

NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];

您应该知道NSInteger 只是int 的名称(实际上,底层类型取决于操作系统,但它始终是具体类型而不是Objective C 对象)。或者换一种说法,它不是指针。试试:

NSInteger selectedValue = [thePickerView selectedRowInComponent:i];

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

【讨论】:

  • 我做到了,并且一直在努力寻找另一种让它发挥作用的方法!现在就试试吧……
  • 好的,所以这解决了警告但是现在我为每个轮子返回 0。 (哎呀,输入键手指很痒!)
  • @rich - 如果您在问题中添加编译器警告,它会有所帮助 - 它使人们不必阅读和查找编译器已经指出的代码中的错误。
  • @Abizern 抱歉,我没想到要这样做...不过感谢您的提醒(!)
【解决方案3】:

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

应该这样做。

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

【讨论】:

    【解决方案4】:

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

    NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];
    

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

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

    更重要的是,您将方法返回的内容(索引)与您想要的内容(值)混为一谈。

    这是你需要的:

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

    现在您已经在 selectedValue 中获得了您想要的内容,并且可以将其放入您的操作表中。

    【讨论】:

    • 这确实有道理。但是尝试我现在​​为每个得到类似的东西: Wheel : 4 selectedRow : 0 selectedValue : 291628
    • 啊等一下,那是因为我使用的是 %i 而不是 %@ 无论如何,我仍然得到 0 作为 selectedValue
    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2013-03-15
    • 2012-06-30
    相关资源
    最近更新 更多