UIPickerView 委托被无限次调用
UIPickerView delegate is called infinite number of times
我有一个非常旧的应用程序,其中有 UIPickerView,其中委托方法被调用了 n 次,因此应用程序崩溃了。
下面是我的。
我已经将 UIPickerView 连接到它的委托。
我有标签,点击它,我在 uipickerview 中显示了性别。
langLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGestureRecognizergenderLabel = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(genderLabelTapped)];
tapGestureRecognizergenderLabel.numberOfTapsRequired = 1;
[langLabel addGestureRecognizer:tapGestureRecognizergenderLabel];
[tapGestureRecognizergenderLabel release];
-(void) genderLabelTapped {
NSLog(@"genderLabelTapped");
[normalPicker reloadAllComponents];
normalPicker.hidden = NO;
pickerImage.hidden = NO;
continueButton.userInteractionEnabled = NO;
}
我有以下代表。
#pragma mark -
#pragma mark PickerView DataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
NSLog(@"numberOfComponentsInPickerView");
return 1;
}
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenHeight = screenRect.size.height;
if (screenHeight==568) {
[pickerView setFrame: CGRectMake(10, 332, 300, 216)];
} else {
[pickerView setFrame: CGRectMake(10, 244, 300, 216)];
}
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 204, 44)]; // your frame, so picker gets "colored"
label.textColor = [UIColor blackColor];
label.font = [UIFont fontWithName:[NSString stringWithFormat:@"%@", localize(@"myFontNameB")] size:14];
label.textAlignment = NSTextAlignmentCenter;
label.text = [NSString stringWithFormat:@"%@", [arrayGender objectAtIndex:row]];
NSLog(@"changing font 1111...===%@", [arrayGender objectAtIndex:row]);
return label;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [arrayGender count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [arrayGender objectAtIndex:row];
}
我的性别数组如下。
arrayGender = [[NSMutableArray alloc] init];
[arrayGender addObject:@"ENGLISH"];
[arrayGender addObject:@"العربية"];
每当我 运行 这段代码时,我总是看到下面的输出...
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
.
.
.
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
知道出了什么问题吗?
当您 setFrame
of UIPickerView
时,它会调用 -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
。
在这种情况下,要停止循环,删除:
if (screenHeight==568) {
[pickerView setFrame: CGRectMake(10, 332, 300, 216)];
} else {
[pickerView setFrame: CGRectMake(10, 244, 300, 216)];
}
P/s:如果你想在它的delegate/callback方法中改变一个对象的任何东西,小心做。
我有一个非常旧的应用程序,其中有 UIPickerView,其中委托方法被调用了 n 次,因此应用程序崩溃了。
下面是我的。
我已经将 UIPickerView 连接到它的委托。
我有标签,点击它,我在 uipickerview 中显示了性别。
langLabel.userInteractionEnabled = YES; UITapGestureRecognizer *tapGestureRecognizergenderLabel = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(genderLabelTapped)]; tapGestureRecognizergenderLabel.numberOfTapsRequired = 1; [langLabel addGestureRecognizer:tapGestureRecognizergenderLabel]; [tapGestureRecognizergenderLabel release]; -(void) genderLabelTapped { NSLog(@"genderLabelTapped"); [normalPicker reloadAllComponents]; normalPicker.hidden = NO; pickerImage.hidden = NO; continueButton.userInteractionEnabled = NO; }
我有以下代表。
#pragma mark - #pragma mark PickerView DataSource - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { NSLog(@"numberOfComponentsInPickerView"); return 1; } -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenHeight = screenRect.size.height; if (screenHeight==568) { [pickerView setFrame: CGRectMake(10, 332, 300, 216)]; } else { [pickerView setFrame: CGRectMake(10, 244, 300, 216)]; } UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 204, 44)]; // your frame, so picker gets "colored" label.textColor = [UIColor blackColor]; label.font = [UIFont fontWithName:[NSString stringWithFormat:@"%@", localize(@"myFontNameB")] size:14]; label.textAlignment = NSTextAlignmentCenter; label.text = [NSString stringWithFormat:@"%@", [arrayGender objectAtIndex:row]]; NSLog(@"changing font 1111...===%@", [arrayGender objectAtIndex:row]); return label; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return [arrayGender count]; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { return [arrayGender objectAtIndex:row]; }
我的性别数组如下。
arrayGender = [[NSMutableArray alloc] init]; [arrayGender addObject:@"ENGLISH"]; [arrayGender addObject:@"العربية"];
每当我 运行 这段代码时,我总是看到下面的输出...
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:25 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
.
.
.
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===ENGLISH
Oct 24 12:36:26 HardTask-iPad AppName[543] <Warning>: changing font 1111...===العربية
知道出了什么问题吗?
当您 setFrame
of UIPickerView
时,它会调用 -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
。
在这种情况下,要停止循环,删除:
if (screenHeight==568) {
[pickerView setFrame: CGRectMake(10, 332, 300, 216)];
} else {
[pickerView setFrame: CGRectMake(10, 244, 300, 216)];
}
P/s:如果你想在它的delegate/callback方法中改变一个对象的任何东西,小心做。