我在使用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
...
}
答案 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)
{
...
}
}