我收到以下错误。
EXC_BAD_ACCESS
KERN_INVALID_ADDRESS
[UITextField keyboardInputChangedSelection:]
直到这份最新的崩溃报告,我一直无法重现这次崩溃。
我根据我的应用程序中是否设置了didFinishLaunchingWithOptions
密码/密码来调用此视图控制器。applicationWillEnterForeground
现在这是奇怪的事情。
崩溃发生在以下场景中。
- 我在没有设置引脚的情况下运行我的应用程序,我设置了引脚。
- 然后按主页按钮。
- 这个视图控制器弹出,我输入 pin 并且视图被关闭。
- 然后我按下主页按钮。
- 我进入应用程序,出现固定屏幕。
- 我按回家。
- 然后进入应用程序,我得到一个崩溃。
我正在使用 arc,我在 iOS6 上重现了崩溃。
下面是我的代码,我只是看不到问题吗?
.h 文件
#import <UIKit/UIKit.h>
#define PVSectionFooterDefault @"Enter your PIN"
#define PVSectionFooterInvalid @"Invalid!"
#define PVSectionFooterCorrect @"Correct!"
@interface PasscodeViewController : UIViewController <UITableViewDelegate,
UITableViewDataSource, UITextFieldDelegate>{
IBOutlet UITableView *passcodeTable;
IBOutlet UILabel *lblMessage;
}
@property (nonatomic, strong) UITableView *passcodeTable;
@property (nonatomic, strong) UITextField *txtPassword;
@property (nonatomic, strong) UILabel *lblMessage;
@end
.m 文件
#import "PasscodeViewController.h"
#import "AppDelegate.h"
@implementation PasscodeViewController
@synthesize passcodeTable;
@synthesize txtPassword;
@synthesize lblMessage;
- (void)viewDidLoad {
[super viewDidLoad];
//[passcodeTable setBackgroundColor:[UIColor clearColor]];
//[passcodeTable setBackgroundView:nil];
self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
lblMessage.shadowColor = [UIColor whiteColor];
lblMessage.shadowOffset = CGSizeMake(0.0, 1.0);
lblMessage.font = [UIFont systemFontOfSize:14];
lblMessage.textColor = [UIColor darkGrayColor];
lblMessage.text = PVSectionFooterDefault;
txtPassword.isAccessibilityElement = YES;
txtPassword.accessibilityLabel = @"Enter PIN";
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(willShowKeyboard:)
name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didShowKeyboard:)
name:UIKeyboardDidShowNotification object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidShowNotification object:nil];
}
- (void)willShowKeyboard:(NSNotification *)notification {
[UIView setAnimationsEnabled:NO];
}
- (void)didShowKeyboard:(NSNotification *)notification {
[UIView setAnimationsEnabled:YES];
}
#pragma mark - Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
CGRect frame = CGRectMake(cell.frame.origin.x+205,
cell.frame.origin.y+7, 90, 31);
txtPassword = [[UITextField alloc] initWithFrame:frame];
txtPassword.delegate = self;
txtPassword.borderStyle = UITextBorderStyleRoundedRect;
txtPassword.font = [UIFont systemFontOfSize:17.0];
txtPassword.backgroundColor = [UIColor whiteColor];
txtPassword.contentVerticalAlignment =
UIControlContentVerticalAlignmentCenter;
txtPassword.keyboardType = UIKeyboardTypeNumberPad;
txtPassword.returnKeyType = UIReturnKeyDone;
txtPassword.secureTextEntry = YES;
txtPassword.clearButtonMode = UITextFieldViewModeAlways;
cell.textLabel.text = @"Enter PIN";
[cell addSubview:txtPassword];
[txtPassword becomeFirstResponder];
}
return cell;
}
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
return YES;
}
- (BOOL) textFieldShouldClear:(UITextField *)textField {
lblMessage.text = PVSectionFooterDefault;
return YES;
}
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
BOOL res = TRUE;
NSString *newString = [textField.text
stringByReplacingCharactersInRange:range
withString:string];
if ([newString length] == 4) {
NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
NSString *strPassword = [myDefaults stringForKey:@"pass"];
if (strPassword == nil) {
strPassword = @"";
}
if (![newString isEqualToString:strPassword]) {
lblMessage.text = PVSectionFooterInvalid;
} else {
lblMessage.text = PVSectionFooterCorrect;
AppDelegate *appDel = (AppDelegate*)
[[UIApplication sharedApplication] delegate];
appDel.gbooShowingGetStartedPasswordAsk = FALSE;
[self.view removeFromSuperview];
}
} else if ([newString length] < 4) {
lblMessage.text = PVSectionFooterDefault;
}
res = !([newString length] > 4);
return res;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
@end
应用程序委托确实启动了
if (![strPassword isEqualToString:@""]) {
self.gbooShowingGetStartedPasswordAsk = TRUE;
lvc = [[PasscodeViewController alloc]
initWithNibName:@"PasscodeView" bundle:nil];
lvc.view.frame = CGRectMake(0, 20, 320, 460);
[window addSubview:lvc.view];
}
和....
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
if (self.gbooShowingGetStartedPasswordAsk == FALSE) {
NSString *strPassword = [myDefaults stringForKey:@"pass"];
if (strPassword == nil) {
strPassword = @"";
}
if (![strPassword isEqualToString:@""]) {
lvc = [[PasscodeViewController alloc]
initWithNibName:@"PasscodeView" bundle:nil];
int th = self.window.frame.size.height;
lvc.view.frame = CGRectMake(0, 20, 320, th);
lvc.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
[window addSubview:lvc.view];
}
}
}