单击UIAlertview上的按钮后崩溃

时间:2013-11-21 11:43:29

标签: objective-c xcode class delegates uialertview

我有在名为FAClass

的类中显示Alertview的方法
// FAClass.H
#import <Foundation/Foundation.h>

@interface FAClass : NSObject<NSURLConnectionDataDelegate>{

}
// FAClass.M
@implementation FAClass{

}    
- (void)ShowAlert{

    UIAlertView  *FACUpdateAlert = [[UIAlertView alloc]initWithTitle:Nil message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    [FACUpdateAlert show];

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    NSLog(@"%i",buttonIndex);
}

尝试在另一个类中调用此方法时

//FACViewController.M
#import "FACViewController.h"
#import "FAClass.h"
@interface FACViewController ()

@end

@implementation FACViewController

- (void)viewDidLoad
{
    FAClass *Myclass = [[FAClass alloc]init];
    [Myclass ShowAlert];

    [super viewDidLoad];
}

警报视图显示但是当点击alertview按钮时应用程序崩溃,如果uialertview委托自己,如果委托等于NULL没有发生任何事情 我需要在自我FAClass

中创建uialertview委托

enter image description here

enter image description here

enter image description here

7 个答案:

答案 0 :(得分:2)

您需要在使用alertView

的类中实现UIAlertView委托方法
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

检查alertView委托方法here

答案 1 :(得分:0)

initWithTitle:Nil导致崩溃,更改为initWithTitle:@""

答案 2 :(得分:0)

添加一个参数以传递使用警报视图的视图控制器的当前实例。

- (void)ShowAlert:(id)usingInstance{

    UIAlertView  *FACUpdateAlert = [[UIAlertView alloc]initWithTitle:Nil message:@"Message" delegate:usingInstance cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    [FACUpdateAlert show];

}

现在调用方法:

- (void)viewDidLoad
{
    FAClass *Myclass = [[FAClass alloc]init];
    [Myclass ShowAlert:self]; //here self is the current instance of FACViewController. so alertview will know that alert view is shown to FACViewController and hence it will not search the delegate method in FAClass that is what it is doing as per your code

    [super viewDidLoad];
}

// now you can use alertview delegate method here in FACViewController if you want or dont. it will work for both cases.

如果要对其他alertview委托方法使用,请在FACViewController中编写此警报视图delgate方法。

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

 }

答案 3 :(得分:0)

我知道这是一个非常古老的主题,但仍然给它一个机会,希望它可以帮助一个有同样问题的人

不是在视图中调用警报视图,而是在视图中尝试调用它,而不是在方法中显示方法

这样做的原因是,当在视图中调用警报视图时,加载警报视图委托不会被保留,因此您的应用程序崩溃。

更简单的方法是在你的NSObject类中添加dealloc方法,在这种情况下为FAClass

- (void)dealloc{
 NSLog(@"I am leaving the house");
}

因此,它首选仅在屏幕/视图完全加载时显示警报视图以避免崩溃,因为即使您在视图中调用也会出现或查看确实显示您的应用仍会崩溃的方法。

解决此问题的第二种方法是在视图控制器中使用强大的属性

@property (nonatomic,strong) FAClass *popUp;

然后在内部按钮的单击事件或视图中加载/显示了viewcontroller.m文件

    if (self.popUp==nil) {
    self.popUp = [FAClass new];
}

[self.popUp displayAuthPopUp];

答案 4 :(得分:0)

由于EXC_BAD_ACCESS表明存在内存问题, 您应该尝试在FACViewController类中将FAClass变量设置为iVar,如下所示:

//FACViewController.M
#import "FACViewController.h"
#import "FAClass.h"
@interface FACViewController ()
{
      FAClass *Myclass
}
@end

@implementation FACViewController

- (void)viewDidLoad
{
     Myclass = [[FAClass alloc] initWithTitle:Nil message:@"Message" delegate:usingInstance cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    [Myclass ShowAlert];

    [super viewDidLoad];
}

尝试看看它是否有效。

答案 5 :(得分:0)

#import <Foundation/Foundation.h>

@interface FAClass : NSObject<UIAlertviewdelegate>

{

}

- (void)ShowAlert;

// FAClass.M
@implementation FAClass{

}    
- (void)ShowAlert{

    UIAlertView  *FACUpdateAlert = [[UIAlertView alloc]initWithTitle:Nil message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    [FACUpdateAlert show];

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSLog(@"%i",buttonIndex);
}

//////////////////

#import <UIKit/UIKit.h>
#import <FAClass.h>


@interface FACViewController : UIViewController
{

}
@property(strong, nonatomic)FAClass *back;

///////////////


#import "FACViewController.h"

@interface FACViewController ()

@end

@implementation FACViewController

- (void)viewDidLoad
{
    self.back = [[FAClass alloc]init];
    [self.back ShowAlert];

    [super viewDidLoad];
}


use this code works perfectly

答案 6 :(得分:0)

我在我的项目中发现了同样的问题,因此我将UIAlertview替换为UIAlertViewController控制器,因为在iOS 9中不推荐使用UIAlertView,而在iOS 8之后的某个时间它已经无法正常工作,所以请尝试替换为UIAlertViewController