2

我已经搜索并搜索了董事会,但无法弄清楚这一点。它必须是一些简单的东西,就在我面前。

我正在尝试清理我的代码并使其更可重用。我正在使用一些从 UIViewController 工作的 UIActionSheet 代码并制作自己的目标文件。工作正常,直到我添加 UIActionSheetDelegate 方法。

当按下按钮时,它不会触发 actionSheetCancel 方法,而是崩溃且没有堆栈跟踪。每次。

我的代码如下。任何帮助,将不胜感激。我的猜测是因为我没有使用 xcode 故事板工具将事物连接在一起,但我认为这是合法的。

egcTestSheet.h:

#import <UIKit/UIKit.h>

@interface egcTestSheet : NSObject <UIActionSheetDelegate> {

}

- (void) showSheet:(UITabBar *) tabBar
    displayTitle:(NSString *) name;

@end

egcTestSheet.m

#import "egcTestSheet.h"

@implementation egcTestSheet

-(void) showSheet:(UITabBar *)tabBar displayTitle:(NSString *)name{

    UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:name
                                                      delegate:self
                                             cancelButtonTitle:@"Done"
                 destructiveButtonTitle:@"Cancel"otherButtonTitles:nil];

   [menu showFromTabBar:tabBar];
   [menu setBounds:CGRectMake(0,0,320, 700)];

}

// actionsheet delegate protocol item
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex{

    NSLog(@"button index = %d", buttonIndex);
}


- (void)actionSheetCancel:(UIActionSheet *)actionSheet{

    NSLog(@"in action canceled method");
}

@end

从 UIViewController 对象调用代码:

egcTestSheet *sheet = [[egcTestSheet alloc] init];

[sheet showSheet:self.tabBarController.tabBar displayTitle:@"new test"];
4

1 回答 1

6

您的操作表可能在被解雇时被释放(您在使用 ARC 吗?)。这意味着当它试图调用它的委托来通知该委托它的解雇/选择时,它正在尝试调用 self. 此时 Self 是一个悬空指针,因为它已被释放。

在呈现/调用此操作表的视图控制器中,设置一个属性以保留对操作表的引用。在关闭操作表时将属性设置为 nil。

于 2012-07-01T19:50:11.393 回答