我正在尝试从NSDictionary生成UIActionSheet。
codeCountryMap是.h文件中定义的NSDictionary变量。代码编译正确但在运行时崩溃。但是当在handleEvents方法
中完成初始化时,整个代码都有效- (void)viewDidLoad {
[super viewDidLoad];
NSArray *codes = [NSArray arrayWithObjects:@"91", @"01", @"002", nil];
NSArray *cName = [NSArray arrayWithObjects:@"ABC", @"QWE", @"XYZ", nil];
codeCountryMap = [NSDictionary dictionaryWithObjects:codes forKeys:cName];
}
-(IBAction) handleEvents:(id)sender
{
UIActionSheet *displayCodeCountryMap = [[UIActionSheet alloc] initWithTitle:@"Select Country" delegate:self cancelButtonTitle:nil
destructiveButtonTitle:nil otherButtonTitles:nil,nil];
for(id key in codeCountryMap) {
[displayCodeCountryMap addButtonWithTitle:(NSString *)key];
}
[displayCodeCountryMap addButtonWithTitle:@"Cancel"];
displayCodeCountryMap.cancelButtonIndex = [codeCountryMap count];
displayCodeCountryMap.actionSheetStyle = UIActionSheetStyleBlackOpaque;
[displayCodeCountryMap showInView:self.view];
[displayCodeCountryMap release];
[country resignFirstResponder];
}
调用handleEvents:方法时,应用程序崩溃。 任何形式的帮助都会受到极大的关注。
提前致谢。
答案 0 :(得分:2)
这很可能是内存管理问题。看起来您正在将iVar codeCountryMap设置为NSDictionary的自动释放对象而不保留它(至少不在此代码段中)。这意味着当' handleEvents'方法被称为NSDictionary项已从内存中释放。
尝试保留NSDictionary项,或者,如果将codeCountryMap定义为保留属性,则使用以下代码进行设置。
self.codeContryMap = [NSDictionary dictionaryWithObjects:codes forKeys:cName];
这将使用合成方法设置属性并保留它。
答案 1 :(得分:0)
nil
参数中不需要2 otherButtonTitles
个终结符。如果你传入了字符串,则必须终止nil。既然你没有,那么nil
就足够了。
UIActionSheet *displayCodeCountryMap = [[UIActionSheet alloc] initWithTitle:@"Select Country" delegate:self cancelButtonTitle:nil
destructiveButtonTitle:nil otherButtonTitles:nil];