在使用分配的 IBAction (UIButton) 点击 IBOutlet 后,iOS 应用程序崩溃,没有任何异常

Posted

技术标签:

【中文标题】在使用分配的 IBAction (UIButton) 点击 IBOutlet 后,iOS 应用程序崩溃,没有任何异常【英文标题】:iOS app crashes without any exception after tapping IBOutlet with assigned IBAction (UIButton) 【发布时间】:2015-01-30 09:59:19 【问题描述】:

我的任务是创建带有多行文本输入字段的自定义UIAlertView,如果点击了关闭按钮,我需要执行一些操作,一切都运行良好。例如我正在使用:http://iphonedevelopment.blogspot.co.uk/2010/05/custom-alert-views.html

我为测试目的创建了非常简单的弹出窗口。基本上它是UIViewController xib,里面有一个按钮。主类演示如下:

#import "testViewController.h"

@interface testViewController ()

@end

@implementation testViewController

- (id)init

    self = [super initWithNibName:@"testViewController" bundle:nil];

    return self;


- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (void)showInView:(UIView *)view

    [view addSubview:[self view]];
    [[self view] setFrame: [view bounds]];
    [[self view] setCenter:[view center]];


- (IBAction)onTap:(id)sender 
    NSLog(@"All OK");


@end

然后在 root UIViewController 我正在调用我的自定义警报:

- (IBAction)showAlert:(id)sender

    dispatch_async(dispatch_get_main_queue(), ^
        testViewController *alert = [[testViewController alloc] init];
        [alert showInView:[self view]];
    );

到目前为止,我已经尝试过主线程或全局队列甚至同步调度,但一切都以 break on 结束:

int main(int argc, char * argv[]) 
    @autoreleasepool 
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); <-- Thread 1:EXC_BAD_ACCESS (code=1, address=0xa000000c)
    

试图为按钮添加观察者,但还是不行..

非常感谢任何帮助

【问题讨论】:

使用异常断点跟踪错误 您好,感谢 mahi vamsi 的意见。我刚刚发现问题是我的 testViewController 在我点击关闭按钮之前被 ARC 释放了。现在的问题是如何使用 ARC 保留我的 testViewController?理想情况下,当我不必存储变量(即开即忘)时,我想使其与本机 UIAlertView 相同? 对不起,我忘了提到我正在使用异常断点,但应用程序总是停在所描述的点 【参考方案1】:

这里发生的事情是“如果你想将一个 viewcontroller 视图添加到另一个 viewcontroller 的视图中,那么在添加视图之后你应该向编译器传达第二个视图控制器将成为第一个视图控制器的子视图”

即必须预先告知父母与孩子的关系。

现在只需使用以下内容修改您的 showAlert 方法。它正在 100% 工作。

- (IBAction)showAlert:(id)sender 

    dispatch_async(dispatch_get_main_queue(), ^
        testViewController *alert = [[testViewController alloc] init];
        [alert showInView:[self view]];

        [self addChildViewController:alert];
        [alert didMoveToParentViewController:self];
    );

【讨论】:

如果您对我的回答满意,请点击正确的标记或投票给我:)))【参考方案2】:

检查您的 UIButton 是否分配了多个 IBoutlet 或多个 IBAction。这是一个常见问题,有时会在我们不通知的情况下发生。

【讨论】:

【参考方案3】:

原来我的 testViewController 在我点击按钮之前就被 ARC 释放了

【讨论】:

以上是关于在使用分配的 IBAction (UIButton) 点击 IBOutlet 后,iOS 应用程序崩溃,没有任何异常的主要内容,如果未能解决你的问题,请参考以下文章

在 IBAction 中禁用的 UIButton 重新启用自身

自定义 UIButton 触发 IBAction 一次,然后再也不触发

UIButton 和 IBAction

UIbutton不改变IBAction内的背景

UIButton 子类@IBAction 不起作用

如何在不重叠的情况下在 UIButton 中实现两个 IBAction?