UIAlertView崩溃没有错误 - Iphone SDK

时间:2011-02-24 15:55:57

标签: iphone objective-c sdk

我在使用UIAlertView时遇到问题,如果我在ViewController类中使用它一切正常,但如果我尝试在外部类中使用它,我有一般功能(例如警报),按下警报中的按钮应用程序崩溃。

    NSString *msg = @"Message";

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert title" message:msg delegate:self cancelButtonTitle:@"Don't remember" otherButtonTitles:@"OK" , @"remember later", nil];
            [alert show];
            [alert release];

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    //never enter here
...

}

当我们在外部类中使用此代码时,它会崩溃,不要进入按钮单击侦听器。

发生了什么事?

编辑: 在viewDidLoad中,我调用外部类来执行此操作:

General *generalClass = [[General alloc] init];
[generalClass launchAlert];
[generalClass release];

外部课程:

-(void)launchAlert{
      NSString *msg = @"Message";

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert title" message:msg delegate:self cancelButtonTitle:@"Don't remember" otherButtonTitles:@"OK" , @"remember later", nil];
      [alert show];
      [alert release];

      }

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    //never enter here
...

}

5 个答案:

答案 0 :(得分:1)

您的代码看起来很好。

尝试使用调试程序查明崩溃的位置。您可以通过按下命令+ Shift + Y来查看调试器。另外,检查设备上的崩溃日志,可以通过Xcode组织器访问。 (命令+选项+ O)

修改

您正在尝试在警报仍然可见的情况下释放外部课程。使用NSNotification(在UIAlertView委托方法中)在警报被解除时告知应用程序的其余部分。然后释放你的外部类是安全的。

答案 1 :(得分:1)

您可以尝试将选择器添加到主线程,而不是通过简单方法调用它。

[self performSelectorOnMainThread:@selector(launchAlert) withObject:nil waitUntilDone:NO];

让我知道它是否有效!

答案 2 :(得分:0)

尝试将自动释放添加到UIAlertView并删除手动释放调用。

UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Alert title" message:msg delegate:self cancelButtonTitle:@"Don't remember" otherButtonTitles:@"OK" , @"remember later", nil] autorelease];
[alert show];

答案 3 :(得分:0)

您的UIAlert代码没问题。你试过让普通班成为单身人士吗?出于同样的原因,我之前在项目中做过这个。这样你就可以从任何地方访问你预定义的消息了,虽然把响应放到你调用它的类中有点麻烦但是它有可能!

编辑:如果你确实让你的班级单身,请确保你不释放它!

答案 4 :(得分:0)

我在iOS 6中遇到了同样的错误。

您应该实现UIAlertViewDelegate的所有协议方法。

与willDismissWithButtonIndex,didDismissWithButtonIndex等相似。

我已经解决了这个问题。现在工作正常。

示例:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
}

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
}

- (void)alertViewCancel:(UIAlertView *)alertView
{
}

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
  return YES;
}

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
  switch(buttonIndex)
  {
     ...
  }
}