在 IOS7 中不可见 AlertView 上的选择器
Posted
技术标签:
【中文标题】在 IOS7 中不可见 AlertView 上的选择器【英文标题】:Picker On AlertView Not Visible in IOS7 【发布时间】:2013-10-07 12:55:21 【问题描述】:我的以下代码在 iOS 7 以下运行良好 我正在尝试在警报中添加选择器视图,该视图在 ios7 版本以下工作正常但在 ios 7 中它显示没有选择器视图的白色警报。
-(void)showPinPickerAlert
numberarr = [[NSMutableArray alloc]initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];
UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Enter Pin To Change Track me Option" message:@"\n\n\n\n\n\n\n" delegate:self cancelButtonTitle:@"Verify" otherButtonTitles:nil];
UIPickerView *picker=[[UIPickerView alloc]initWithFrame:CGRectMake(25, 30, 230, 60) ];
picker.dataSource=self;
picker.delegate=self;
// picker.backgroundColor=[UIColor blueColor];
picker.showsSelectionIndicator = YES;
// picker.autoresizingMask = UIViewAutoresizingFlexibleHeight;
picker.transform = CGAffineTransformMakeScale(0.6, 0.6);
alert.tag=100;
// picker.transform = CGAffineTransformMakeScale(1, 0.2);
[alert addSubview:picker];
[alert show];
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
return 4;
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
strPin=[[NSString stringWithFormat:@"%i%i%i%i",[pickerView selectedRowInComponent:0],[pickerView selectedRowInComponent:1],[pickerView selectedRowInComponent:2],[pickerView selectedRowInComponent:3]]mutableCopy];
NSLog(@"strPin=%@",strPin);
// mlabel.text= [arrayNo objectAtIndex:row];
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
return [numberarr count];
**//code try to change color of picker text and background thats work fine in below ios7 but in iOS 7 still shows white screen**
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
UILabel *label = (UILabel*) view;
if (label == nil)
label = [[UILabel alloc] init];
//[label setText:@"Whatever"];
// This part just colorizes everything, since you asked about that.
[label setTextColor:[UIColor whiteColor]];
[label setBackgroundColor:[UIColor blackColor]];
CGSize rowSize = [pickerView rowSizeForComponent:component];
CGRect labelRect = CGRectMake (0, 0, rowSize.width, rowSize.height);
[label setFrame:labelRect];
return label;
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
pickerView.backgroundColor=[UIColor blackColor];
return [numberarr objectAtIndex:row];
输出在下面
IOS 7 中的输出
如何解决?
【问题讨论】:
找到第 3 方警报视图并使用它。您永远不应该向UIAlertView
添加子视图 - 它从未得到官方支持。
【参考方案1】:
从 iOS7 开始,不再支持向 UIAlertView
添加子视图。
您应该实现自己的视图并尝试与警报视图类似,或者像其他人所说的那样,使用像这样的第 3 方警报视图:
https://github.com/wimagguc/ios-custom-alertview
【讨论】:
【参考方案2】:以下大部分代码来自 ios7 之前的堆栈溢出答案。
PickerPrompt.h
#import <UIKit/UIKit.h>
@interface PickerPrompt : UIAlertView <UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate>
UIPickerView *_pickerView;
NSMutableArray *_options;
@property (readonly) NSString *enteredText;
- (id)initWithTitle:(NSString *)title message:(NSString *)message options:(NSMutableArray*)options delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle okButtonTitle:(NSString *)okButtonTitle;
@end
pickerPrompt.m
#import "PickerPrompt.h"
@implementation PickerPrompt
#define VIEW_TAG 49
#define SUB_LABEL_TAG 52
#define LABEL_TAG 53
#define COMPONENT_WIDTH 250
#define LABEL_WIDTH 10
@synthesize enteredText;
- (id)initWithTitle:(NSString *)title message:(NSString *)message options:(NSMutableArray*)options delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle okButtonTitle:(NSString *)okayButtonTitle
if (self = [super initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:okayButtonTitle, nil])
_options = options;
_pickerView = [[UIPickerView alloc] init];
[_pickerView sizeToFit];
[_pickerView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[_pickerView setDelegate:self];
[_pickerView setDataSource:self];
[_pickerView setShowsSelectionIndicator:TRUE];
// Change from pre iOS 7
[self setAlertViewStyle:UIAlertViewStylePlainTextInput];
[[self textFieldAtIndex:0] setDelegate:self];
[[self textFieldAtIndex:0] setInputView:_pickerView];
[[self textFieldAtIndex:0] becomeFirstResponder];
return self;
#pragma mark -
#pragma mark Picker delegate
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 1;
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
if (pickerView == _pickerView)
return [_options count];
return [_options count];
- (UIView *)labelCellWithWidth:(CGFloat)width rightOffset:(CGFloat)offset
// Create a new view that contains a label offset from the right.
CGRect frame = CGRectMake(0.0, 0.0, width, 32.0);
UIView *view = [[[UIView alloc] initWithFrame:frame] autorelease];
view.tag = VIEW_TAG;
frame.size.width = width - offset;
UILabel *subLabel = [[UILabel alloc] initWithFrame:frame];
subLabel.textAlignment = UITextAlignmentRight;
subLabel.backgroundColor = [UIColor clearColor];
subLabel.font = [UIFont systemFontOfSize:24.0];
subLabel.userInteractionEnabled = NO;
subLabel.tag = SUB_LABEL_TAG;
[view addSubview:subLabel];
[subLabel release];
return view;
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
NSString *fullString = [[textField text] stringByAppendingString:string];
for (NSString* object in _options)
if ([object isEqualToString:fullString])
return YES;
return NO;
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
UIView *returnView = nil;
if ((view.tag == VIEW_TAG) || (view.tag == LABEL_TAG))
returnView = view;
else
returnView = [self labelCellWithWidth:COMPONENT_WIDTH rightOffset:LABEL_WIDTH];
// The text shown in the component is just the number of the component.
NSString *text = [_options objectAtIndex:row];
// Where to set the text in depends on what sort of view it is.
UILabel *theLabel = nil;
if (returnView.tag == VIEW_TAG)
theLabel = (UILabel *)[returnView viewWithTag:SUB_LABEL_TAG];
else
theLabel = (UILabel *)returnView;
theLabel.text = text;
return returnView;
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
return COMPONENT_WIDTH;
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
[[self textFieldAtIndex:0] setText:[_options objectAtIndex:row]];
- (NSString *)enteredText
return [[self textFieldAtIndex:0] text];
@end
如何使用(从警报视图委托中调用):
PickerPrompt *prompt = [PickerPrompt alloc];
NSMutableArray *options = [[NSMutableArray alloc] initWithObjects:@"option 1", @"option 2", nil];
prompt = [prompt initWithTitle:@"Select Option" message:@"Select Option" options:options delegate:self cancelButtonTitle:@"Cancel" okButtonTitle:@"Okay"];
[prompt show];
[prompt release];
【讨论】:
以上是关于在 IOS7 中不可见 AlertView 上的选择器的主要内容,如果未能解决你的问题,请参考以下文章
CustomAlertView 按钮在 ios 8 中不可见
UITableviewCell textLabel在ios7中不可见
alertView:(UIAlertView *) alertView 方法在 Appdelegate 中不起作用