我有一个类,我实例显示如下警告视图:
- (void)showAlert
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Do you want to try again?"
message:nil
delegate:self
cancelButtonTitle:@"Yes"
otherButtonTitles:@"No", nil];
[alertView show];
}
}
我需要self
作为委托,因为当用户点按警报视图的按钮时,我需要调用alertView:didDismissWithButtonIndex:
来执行某些操作。这通常很有效,但我不时会遇到这种情况:
SIGSEGV
UIKit-[UIAlertView(Private) modalItem:shouldDismissForButtonAtIndex:]
我想这是因为代表因任何原因被释放了,对吧?或者这是因为发布的是警报视图?我该怎么解决这个问题?我需要警报视图才能有一个代表,我正在阅读几个相关的帖子,但我找不到符合我情景的答案。
我在iOS 7.0中测试,我不知道这是否与此问题有关。
提前致谢
答案 0 :(得分:3)
当代理人被释放时,您似乎点击了警告:
delegate:self
这是因为UIAlertView委托属性是赋值类型(不弱!)。 因此,您的委托可能会指向已发布的对象。
解决方案:
在dealloc方法中,您需要清除alertView的委托
- (void)dealloc
{
_alertView.delegate = nil;
}
但在您需要制作iVar _alertView并将其用于alertViews之前
- (void)showAlert
{
_alertView = ...;
[_alertView show];
}
答案 1 :(得分:0)
按如下方式更新您的代码:
- (void)showAlert {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Do you want to try again?"
message:nil
delegate:self
cancelButtonTitle:@"Yes"
otherButtonTitles:@"No", nil];
[alertView show];
}
由于您遗漏了nil
部分的otherButtonTitles
。
如果您未添加nil
,则会显示方法调度警告中缺少的哨兵。
答案 2 :(得分:0)
这是因为在单击按钮时释放了alertView的委托对象。我认为这是SDK的一个错误:
@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate; // weak reference
应该是:
@property(nonatomic, weak) id /*<UIAlertViewDelegate>*/ delegate; // weak reference
解决问题: