2012-07-01 22 views
2

我已經搜索並搜索了該板,並且無法弄清楚這一點。它必須是一些簡單而恰到好處的東西。當從UIViewController文件移動到單獨的類文件時,UIActionSheet代碼崩潰

我想清理我的代碼,並使其更加可重用。我正在從UIViewController獲取一些UIActionSheet代碼,並創建它自己的目標文件。工作正常,直到我添加UIActionSheetDelegate方法。

當按下按鈕而不是觸發actionSheetCancel方法時,它會崩潰而沒有堆棧跟蹤。每次。

我的代碼如下。任何幫助,將不勝感激。我的猜測是因爲我沒有使用xcode storyboard工具來將東西連接在一起,但我認爲這是合法的。

egcTestSheet.h:

#import <UIKit/UIKit.h> 

@interface egcTestSheet : NSObject <UIActionSheetDelegate> { 

} 

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

@end 

egcTestSheet.m從一個UIViewController對象

#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 

調用代碼:

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

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

哪一行是罪魁禍首? –

回答

6

你的動作片很可能被釋放,因爲它是被解僱(你在使用ARC嗎?)。這意味着當它試圖打電話給它的代表通知代理人其解僱/選擇時,它正在試圖呼叫自我。此時,自我是一個懸掛指針,因爲它已經被釋放。

在呈現/調用此操作表的視圖控制器中,設置屬性以保留對操作表的引用。在解除操作表時將該屬性設置爲零。

+0

你打在頭上。將創建移至@property(強大的非原子),問題就消失了。它顯然已經超出了範圍。謝謝! – user1494653

+2

非常感謝您的回答。雖然從上面的回答和評論中可以清楚地看出,如果有人遇到這種情況,我想我會澄清一下,您需要創建的@property(強,非原子)是爲您創建的自定義類對象創建的,而不是用於在課程中內部使用的UIActionSheet對象。 –

相關問題