另一个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];
}
}
}
答案 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
得到了你想要的东西,并且可以把它放在你的行动表中。