1

我有一个我实例化的类来显示这样的警报视图:

- (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 中进行测试,我不知道这是否与问题有关。

提前致谢

4

3 回答 3

3

似乎您在其代表被释放时点击了警报:

delegate:self

发生这种情况是因为 UIAlertView 委托属性是分配类型(不是弱!)。因此,您的委托可能会指向已发布的对象。

解决方案:

在 dealloc 方法中,您需要为您的 alertView 清除委托

- (void)dealloc
{
    _alertView.delegate = nil;
}

但在您需要制作 iVar _alertView 并将其用于您的 alertViews 之前

- (void)showAlert
{       
     _alertView = ...;

     [_alertView show];
}
于 2014-04-02T11:46:41.150 回答
0

这是因为 alertView 的委托对象在单击按钮时释放。我认为这是SDK的一个错误:

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate;    // weak reference

应该:

@property(nonatomic, weak) id /*<UIAlertViewDelegate>*/ delegate;    // weak reference

要解决此问题:

  1. 使用关联为 UIAlertView 添加弱委托。
  2. swizzle init,setDelegate: 委托方法,将 alertView 委托设置为 self,将步骤 1 的弱委托与参数委托一起设置。
  3. 实现所有委托方法,使用弱委托传递方法。
于 2014-08-20T08:14:47.253 回答
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];
}

这是由于您缺少nilforotherButtonTitles部分。

如果您没有添加nil.

于 2014-04-02T13:24:05.293 回答