我很愚笨……重写UIPickerView的代理函数

linux_fay 2011-05-28 08:26:53
在重写-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{}函数时,实现了点击一个按钮alloc两个PickerView,但是当我在选第二个pickerView时,总是判断出错!可能我的逻辑上有点问题,可我不知道错在哪里?其实就是简单的if,else-if之间的判断关系下。面是部分代码:
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

int selectedRow;
selectedRow = [pickerView selectedRowInComponent:component];

NSLog(@"selectedRow = %i", selectedRow);//这里调试的是第一个pickerView的row的值,显示正确
if([btn tag] ==1){ //点击tag为1的按钮,只显示一个pickerView
if (selectedRow == 0) {
NSLog(@"3KM");
[btn setTitle:@"3公里" forState:nil];
}
else if(selectedRow == 1){
NSLog(@"2KM");
[btn setTitle:@"2公里" forState:nil];
}
else if(selectedRow == 2){
NSLog(@"1KM");
[btn setTitle:@"1公里" forState:nil];
}
else{
NSLog(@"500m");
[btn setTitle:@"500米" forState:nil];
}
[distanceView removeFromSuperview];
}

else if([btn tag] == 2){ //点击tag为2的按钮,显示两个pickerView,在另一个代理函数中实现了

if(component == AddressComponent){ // #define AddressComponent 0 第一个pickerView

if(selectedRow == 0){
NSLog(@"北京");
sectionData = [[NSMutableArray alloc] initWithArray:sectionDataOfBeijing];
[addressView reloadComponent:SectionComponent];
}
else if(selectedRow == 1){
NSLog(@"上海");
sectionData = [[NSMutableArray alloc] initWithArray:sectionDataOfShanghai];
[addressView reloadComponent:SectionComponent];
}
else if(selectedRow == 2){
NSLog(@"深圳");
sectionData = [[NSMutableArray alloc] initWithArray:sectionDataOfShenzhen];
[addressView reloadComponent:SectionComponent];
}
else if(selectedRow == 3){
NSLog(@"广州");
sectionData = [[NSMutableArray alloc] initWithArray:sectionDataOfGuangzhou];
[addressView reloadComponent:SectionComponent];
}
}
else if(component == SectionComponent){ //define SectionComponent 1 第二个pickerView

int selectedSectionRow;
selectedSectionRow = [pickerView selectedRowInComponent:SectionComponent];

NSLog(@"(selectedRow = %i, selectedSectionRow = %i)", selectedRow,selectedSectionRow);
//这里调试的是两个pickerView中被选定row的值,不知道为什么,selectedRow没有保存上次的记录,
//即使我把它设成是static也不行,只有当(0,0),(11),(2,2),(3,3)…时才能正确的处理。
if(selectedSectionRow == 0 && selectedRow == 0) //这个可以
{
NSLog(@"北京 北京1");
[btn setTitle:@"北京 北京1" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 0 && selectedRow == 1){ //当我第二个pickerView选上海1时,btn的title变为了"北京 北京1",打印两个变量的值为(0,0)
NSLog(@"上海 上海1");
[btn setTitle:@"" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 1 && selectedRow == 1){
NSLog(@"上海 上海2");
[btn setTitle:@"上海 上海2" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 0 && selectedRow == 2){
//只要是selectedSectionRow的值为0,则selectedRow的值也为0,selectedSectionRow的值为1,selectedRow的值也为1

NSLog(@"深圳 深圳1");
[btn setTitle:@"深圳 深圳1" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 1 && selectedRow == 2){
NSLog(@"深圳 深圳2");
[btn setTitle:@"深圳 深圳2" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 2 && selectedRow == 2){
NSLog(@"深圳 深圳3");
[btn setTitle:@"深圳 深圳3" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 0 && selectedRow == 3){
NSLog(@"广州 广州1");
[btn setTitle:@"广州 广州1" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 1 && selectedRow == 3){
NSLog(@"广州 广州2");
[btn setTitle:@"广州 广州2" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 2 && selectedRow == 3){
NSLog(@"广州 广州3");
[btn setTitle:@"广州 广州3" forState:nil];
[addressView removeFromSuperview];
}
else if(selectedSectionRow == 3 && selectedRow == 3){
NSLog(@"广州 广州4");
[btn setTitle:@"广州 广州4" forState:nil];
[addressView removeFromSuperview];
}
}
}
}


现在我的第二个pickerView的内容会随着第一个pickerView选中行的值不同而改变。但是在选第二个pickerView时不能正确选择。
可能很多大侠会说我,都不自己思考一下,就一直发帖问,可是我真的是想了一天了!我一直按照我的逻辑去思考,所以一直困在里面出不来。实在是没有办法了,因为公司就我一个人做iPhone开发,只能在网上问你们了。谢谢各位!
...全文
422 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yukiwang313 2011-05-30
  • 打赏
  • 举报
回复
不懂的飘过
linux_fay 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yukiwang313 的回复:]
呵呵,解决就好。。最近我在看网络和数据库 哎。。。
[/Quote]
耐心点,得多去实践才能发现问题~ 加油!
yukiwang313 2011-05-30
  • 打赏
  • 举报
回复
呵呵,解决就好。。最近我在看网络和数据库 哎。。。
linux_fay 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yukiwang313 的回复:]
不懂的飘过
[/Quote]

每次都来捧场,哈哈,这个问题解决了~
linux_fay 2011-05-30
  • 打赏
  • 举报
回复
问题解决了,是我自己太粗心了

我在[btn tag]==2的处理函数中重新定义两个变量:

int selectedAddressRow;
selectedAddressRow = [addressView selectedRowInComponent:AddressComponent];

int selectedSectionRow;
selectedSectionRow = = [addressView selectedRowInComponent:SectionComponent];

之后再进行处理就行了!
吸起教训,一定要认真!!!
Proteas 2011-05-29
  • 打赏
  • 举报
回复
去掉第一个,看看第二个本身的行为是否正确。
tag 设置是否正确。
要一点点缩小问题的范围。
Dead_Cicle 2011-05-29
  • 打赏
  • 举报
回复
很抱歉不能帮上你的忙,但是我想你起码可以用switch-case代替一下这么多让人眼花的if-else吧。
linux_fay 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dead_cicle 的回复:]
很抱歉不能帮上你的忙,但是我想你起码可以用switch-case代替一下这么多让人眼花的if-else吧。
[/Quote]
哥们客气了,你说的对,用switch-case会好很多,我明天改改,谢谢你的提醒!
linux_fay 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 proteas 的回复:]
去掉第一个,看看第二个本身的行为是否正确。
tag 设置是否正确。
要一点点缩小问题的范围。
[/Quote]
tag的设置是没有问题的,但是第一个去掉,就不能根据第一个来更新第二个pickerView的显示内容了。我想把两个调换一下。不过只能明天上班了去试试!

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧