【问题标题】:UIActionSheet crash when selecting item选择项目时 UIActionSheet 崩溃
【发布时间】:2014-05-05 23:12:22
【问题描述】:

我有一个UIView,我正在以编程方式将其添加到我的UIViewController。这个视图包含一些按钮,其中一个打开一个UIActionSheet

当我点击任一UIActionSheet 选项时,应用程序会在调用委托之前立即崩溃。

我假设这是一个内存问题,但我想我已经涵盖了所有的角落。

  • 自定义UIView 是父视图控制器上的强属性。
  • 正在从父视图控制器的标签栏显示操作表。
  • 操作表委托是UIView,并且委托方法已正确实现。

错误是 EXC_BAD_ACCESS。 ([ContactOptionView actionSheet:clickedButtonAtIndex:]: 消息发送到解除分配的实例)

任何帮助,非常感谢。

使用此代码创建操作表,其中 CDField 对象是核心数据 NSManagedObject:

UIActionSheet *sheet = [[UIActionSheet alloc] init];
sheet.title = title;
for (CDField *field in fields) {
    [sheet addButtonWithTitle:field.value];
}
sheet.cancelButtonIndex = [sheet addButtonWithTitle:@"Cancel"];
sheet.delegate = self;
[sheet showFromTabBar:self.parentViewController.tabBarController.tabBar];

【问题讨论】:

  • 你能显示错误信息吗?
  • 请也显示一些代码。谢谢。
  • @Larme - 问题已更新。
  • 您是否对所有“field.value”值进行了 NSLog 记录以确保它们有效?
  • 由于单击按钮后它会崩溃,我认为您的 UIActionSheet Delegate 方法的代码可能很有用。另外,尝试让 NSZombies 了解更多有关崩溃的信息。还要尝试确定导致崩溃的行。

标签: ios objective-c uiactionsheet


【解决方案1】:

将 ActionSheet 声明为强类属性而不是本地声明可能会由于延长其生存时间而解决此问题。

@interface MyTableViewController ()

@property (strong, nonatomic) UIActionSheet *actionSheet;

@end    
@implementation MyViewController
@synthesize actionSheet = _actionSheet;
- (UIActionSheet *)actionSheet {
    if (!_actionSheet) {
        _actionSheet = [[UIActionSheet alloc] initWithTitle:@"title 
                                                   delegate:self
                                          cancelButtonTitle:@"Cancel"
                                     destructiveButtonTitle:nil 
                                          otherButtonTitles:@"do something", nil), nil];
    }
    return _actionSheet;
}

hth, 彼得

【讨论】:

  • 谢谢彼得。我试过了,不幸的是没有任何区别。
  • 错误消息告诉我们一些关于访问对象的信息,该对象已被删除。你的委托方法里面有什么?您是否尝试过注释掉委托方法中的所有内容,以便只执行 NSLog("bla") 语句或使用断点进行调试?
  • 没有调用委托方法。
  • hmmm...我已经用一些示例代码更新了我的答案。该代码确实对我有用...
  • 彼得 - 我现在解决了这个问题。当用户从屏幕上抬起手指时,我正在释放 UIView(这意味着操作表的委托不再存在)。感谢您的帮助。
【解决方案2】:

我在@Larme 的帮助下解决了我的问题。我添加到视图控制器的 UIView 是在长按手势上创建的,当长按手势结束时,视图被释放。显示操作表时,用户必须将手指从屏幕上移开才能点击所选选项,此时操作表的委托(视图)正在被释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多