1

我希望用户得到一个提示屏幕,它会有是和否选项。问题是UIAlertView不能从子线程调用,如果我从子线程调用它,我会收到运行时错误(EXC_BAD_ACCESS)。我NSThread在IOS6.1上使用

这是我正在使用的代码

-(void) construct
{
    NSThread *initThread =[[NSThread alloc]initWithTarget:self selector:@selector(error) object:nil];
    [initThread start];
}

- (void) error
{
    //make sure it runs on the main thread
    dispatch_async(dispatch_get_main_queue(), ^{

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Save"
                                                            message:@"Enter File Name"
                                                            delegate:self
                                                   cancelButtonTitle:@"Cancel"
                                                   otherButtonTitles:@"OK", nil];

        alertView.alertViewStyle = UIAlertViewStylePlainTextInput;

        [alertView show];
    });
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    NSLog(@"Alert View dismissed with button at index %d",buttonIndex);

    switch (alertView.alertViewStyle)
    {
        case UIAlertViewStylePlainTextInput:
        {
            UITextField *textField = [alertView textFieldAtIndex:0];
            NSLog(@"Plain text input: %@",textField.text);
        } break;
        case UIAlertViewStyleSecureTextInput:
        {
            UITextField *textField = [alertView textFieldAtIndex:0];
            NSLog(@"Secure text input: %@",textField.text);
        } break;
        case UIAlertViewStyleLoginAndPasswordInput:
        {
            UITextField *loginField = [alertView textFieldAtIndex:0];
            NSLog(@"Login input: %@",loginField.text);

            UITextField *passwordField = [alertView textFieldAtIndex:1];
            NSLog(@"Password input: %@",passwordField.text);
        }break;
        default: break;
    }
}

这是我得到的错误:

[NSURLCacheInternal alertView:didDismissWithButtonIndex:]: unrecognized selector sent to instance 0x8653630
2013-07-26 16:12:35.738 iOSTrack[7455:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURLCacheInternal alertView:didDismissWithButtonIndex:]: unrecognized selector sent to instance 0x8653630'
*** First throw call stack:
(0x1e7a012 0x1796e7e 0x1f054bd 0x1e69bbc 0x1e6994e 0x7c0e13 0x408d66 0x408f04 0x20e7d8 0x266b014 0x265b7d5 0x1e20af5 0x1e1ff44 0x1e1fe1b 0x1dd47e3 0x1dd4668 0x3caffc 0x21cd 0x20f5)
libc++abi.dylib: terminate called throwing an exception
4

2 回答 2

1

最有可能发生的事情是您的 UIAlertView 是一个局部变量,并且在委托有机会运行之前它已被销毁。您需要保持对它的引用足够长的时间,以便您的代表有机会运行并完成它的工作。那么你就很清楚了。此概念适用于 ARC 和基于手动内存管理的代码。

看到这个相关的问题:UIAlertViewDelegate class "self" instance gets dealloc'd before button gets press

于 2013-07-26T05:32:07.990 回答
0

我尝试过的代码实际上对我来说很好

唯一的区别是

[alertView show]=> [alertView show];你错过;了,我猜是一个错字

在单独的线程中运行代码

 dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
    dispatch_async(myQueue, ^{
        // Perform long running process
        [self error];
    });

- (void) error {
    //make sure it runs on the main thread
    dispatch_async(dispatch_get_main_queue(), ^{

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Save"
                                                            message:@"Enter File Name"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"OK", nil];

        alertView.alertViewStyle = UIAlertViewStylePlainTextInput;

        [alertView show];
    });
}
于 2013-07-26T05:38:04.800 回答