代码之家  ›  专栏  ›  技术社区  ›  yozhik

UIAcExtVIEW退出Excel BADIX访问错误

  •  0
  • yozhik  · 技术社区  · 14 年前

    我有这样的错误:当我单击navigationbar.backItemButton时,我显示的是带有两个按钮的UIAlertView。当我按下其中任何一个按钮时,应用程序将以EXC_BAD_访问权限终止。方法-(void)alertView:(UIAlertView*)alertView clickedbuttonindex:(NSInteger)buttonIndex不调用。我该怎么解决?谢谢!

    //h-文件

    @interface DetailsTableViewController : UITableViewController <UITextFieldDelegate, UIAlertViewDelegate>
    

    //m-文件

    - (void)viewWillDisappear:(BOOL)animated
    {
        //if changes unsaved - alert reask window
        if (isDirty)
        {
            UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Save changes?"  
                                                          message:@"Press YES if you want to save changes before exit, NO - other case."  
                                                         delegate: self  
                                                        cancelButtonTitle: @"NO"  
                                                        otherButtonTitles: @"YES", nil];   
    
            [message show];  
    
            [message autorelease];
        }   
    }
    
        - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        NSString *title = [alertView buttonTitleAtIndex: buttonIndex];  
    
        if([title isEqualToString: @"YES"])  
        {  
            [self saveBtnUserClick];    
        } 
    }
    
    5 回复  |  直到 14 年前
        1
  •  3
  •   Vladimir    14 年前

    我认为问题在于,在您点击back按钮后,当前控制器将从导航堆栈中移除并解除分配,因此当alert尝试调用其委托方法时,它将在解除分配的对象上调用它们,这将导致 EXC_BAD_ACCESS 错误。为了解决这个问题,我看到了两个明显的选择(尽管可能有更好的解决方案):

    1. 额外的保留你的控制器在某个地方(在以前的控制器可能是),但你需要找到方法释放它时,你完成了。
    2. 创建您的自定义按钮,而不是标准的“上一步”,只显示警报时,它点击。然后在alert的delegate方法中,从导航堆栈中弹出当前控制器。
        2
  •  2
  •   Harikrishnan    12 年前

    尝试将委托更改为nil而不是self。它解决了我的问题。

        3
  •  1
  •   Bourne    14 年前

    您的视图控制器是否正在实现UIAlertViewDelegate?如果没有,请在{开始之前添加接口声明。

    也可以在clickedbuttonindex方法中尝试NSLogging,并打印buttonIndex值并查看控制台。

    编辑:再次阅读您的文章,我想您确实错过了界面声明中的UIAlertViewDelegate。

        4
  •  1
  •   Amitesh Kumar    14 年前

    可能是[消息自动释放]; 你用错了吗 [信息发布];

    因为您使用了[[UIAlertView alloc]init….];所以应该释放内存。

    autorelease是与内存依赖于编译器或您没有手动给定内存的结构一起工作的。

    享受吧。

        5
  •  0
  •   Vinicius Souza    11 年前

    “尝试将委托更改为nil而不是self。它解决了我的问题。塔克斯