我有这样的错误:当我点击navigationbar.backItemButton我用两个按钮显示UIAlertView。当我按下其中任何一个时,应用程序终止只有EXC_BAD_ACCESS。方法 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex :( NSInteger)buttonIndex不调用。我该如何解决?感谢名单!
// h - file
@interface DetailsTableViewController : UITableViewController <UITextFieldDelegate, UIAlertViewDelegate>
// m - file
- (void)viewWillDisappear:(BOOL)animated
{
//if changes unsaved - alert reask window
if (isDirty)
{
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Save changes?"
message:@"Press YES if you want to save changes before exit, NO - other case."
delegate: self
cancelButtonTitle: @"NO"
otherButtonTitles: @"YES", nil];
[message show];
[message autorelease];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString *title = [alertView buttonTitleAtIndex: buttonIndex];
if([title isEqualToString: @"YES"])
{
[self saveBtnUserClick];
}
}
答案 0 :(得分:3)
我认为问题在于,在您点击后退按钮后,您的当前控制器将从导航堆栈中删除并取消分配,因此当警报尝试调用其委托方法时,它会在解除分配的对象上调用它们,从而导致EXC_BAD_ACCESS
错误。为了解决这个问题,我看到了两个明显的选择(虽然可能有更好的解决方案):
答案 1 :(得分:2)
尝试将委托更改为nil而不是self。它解决了我的问题。
答案 2 :(得分:1)
您的视图控制器是否实现了UIAlertViewDelegate?如果没有,请在{starts。
之前添加接口声明还可以在clickedButtonAtIndex方法中尝试NSLogging并打印buttonIndex值并查看控制台。
编辑:再次阅读你的帖子,我猜你确实错过了你的界面声明中的UIAlertViewDelegate。
答案 3 :(得分:1)
可能[消息自动释放]; 你错了用吗? [消息发布];
因为你已经使用了[[UIAlertView alloc] init .....];因为你应该释放记忆。
autorelease是一种适用于内存依赖于编译器的结构或者您没有手动提供内存的结构。
享受。
答案 4 :(得分:0)
&#34;尝试将委托更改为nil而不是self。它解决了我的问题。&#34;为我工作。感谢名单