你真的不应该做一些违背苹果建议的事情。
原因
- 您可能会遇到意想不到的问题,例如您所面临的问题。
- 当您违反建议时,您的代码可能会在未来的 iOS 版本中中断。
- 重新设计 Apple 的标准控件违反了 HIG 准则。因此,您的应用程序有可能被拒绝。而是使用子类创建自己的
UIView
。
作为替代方案,Apple 已UIAlertView
为此要求做出规定。您不需要向警报视图添加文本字段,而是使用UIAlertView
属性alertViewStyle
。它接受枚举中定义的值UIAlertViewStyle
typedef NS_ENUM(NSInteger, UIAlertViewStyle) {
UIAlertViewStyleDefault = 0,
UIAlertViewStyleSecureTextInput, // Secure text input
UIAlertViewStylePlainTextInput, // Plain text input
UIAlertViewStyleLoginAndPasswordInput // Two text fields, one for username and other for password
};
例如,让我们假设您想要接受用户密码的用例。实现这一点的代码如下。
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please enter password"
message:nil
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Continue", nil];
[alert setAlertViewStyle:UIAlertViewStyleSecureTextInput];
[alert show];
要验证输入,假设输入的密码必须至少为 6 个字符,请实现此委托方法,
- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
NSString *inputText = [[alertView textFieldAtIndex:0] text];
if( [inputText length] >= 6 )
{
return YES;
}
else
{
return NO;
}
}
获取用户输入
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if([title isEqualToString:@"Login"])
{
UITextField *password = [alertView textFieldAtIndex:0];
NSLog(@"Password: %@", password.text);
}
}
要重新迭代,
UIAlertView
具有私有视图层次结构,建议按原样使用它而不进行修改。如果你不推荐使用它,你会得到意想不到的结果。
来自苹果文档
UIAlertView 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。
这是即使在 iOS 默认应用程序中使用的标准技术(例如:输入 Wi-Fi 密码等),因此使用它可以确保您不会遇到您提到的问题。
希望有帮助!