我的一个 iPad 应用程序有一个奇怪的问题。
当应用程序启动时,我可以点击一个条形按钮项以显示一个 UIActionSheet,并且操作表从条形按钮项正常显示,其中包含所有按钮选项和标题。但是,如果我从这张表中选择一个动作,它会使用 presentViewController 来显示另一个非常简单的视图控制器,并且当该视图控制器自行关闭时,如果我点击与之前相同的栏按钮项,我会得到一个不正确的动作表. 这是操作表弹出框的样子:
操作表的高度对于操作表应该具有的选项数量是正确的,但它就像标题一样,所有按钮文本都是空的或为零。但是,在创建操作表之后,我记录了每个按钮的数量和按钮文本,从第一次到第二次,一切看起来都一样。
我使用的是最新的 Xcode 和 SDK,并且该应用程序面向 iOS 5.0 或更高版本。关于发生了什么的任何想法?
编辑:这是一些代码。可能存在一些异常(语法和格式方面),因为我不得不删掉一堆与此问题无关的代码。
按下维护按钮的 IBAction:
-(IBAction) cmdMaintenance_Click:(id)sender
{
self.maintenanceActionSheet = [[[UIActionSheet alloc] initWithTitle:@"Title"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Backup", @"About", nil] autorelease];
_maintenanceActionSheet.actionSheetStyle = UIActionSheetStyleDefault;
_maintenanceActionSheet.tag = MAINTENANCE_OPTIONS;
NSLog(@"Number of buttons: %d", _maintenanceActionSheet.numberOfButtons);
for (int idx = 0; idx < _maintenanceActionSheet.numberOfButtons; idx++)
{
NSLog(@"Sheet button %d: %@", (idx + 1), [_maintenanceActionSheet buttonTitleAtIndex:idx]);
}
[_maintenanceActionSheet showFromBarButtonItem:cmdMaintenance animated:NO];
}
和行动表委托:
-(void)actionSheet:(UIActionSheet*)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if(buttonIndex != [actionSheet cancelButtonIndex])
{
if(buttonIndex == OPTIONS_ABOUT)
{
if(aboutView == nil)
{
aboutView = [[AboutViewController alloc] initWithNibName:@"AboutView-iPad" bundle:nil];
aboutView.title = [MyAppDelegate translateString:@"About"];
}
[self presentViewController:aboutView animated:YES completion:nil];
}
}
}
在我的关于视图控制器中,完成按钮代码:
-(IBAction)done:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
}
编辑 2:最后一点...如果我用 aboutView 注释掉对 presentViewController 的调用,则操作表会正确返回。
编辑3:这里的问题归结为......世界上什么可能导致 UIActionSheet 像我所看到的那样显示弹出窗口?我的主视图控制器有其他区域显示 UIActionSheet 以征求用户反馈(例如删除客户),并且这些其他区域显示与维护按钮相同的行为,即非常垂直薄的操作表。
编辑4:我把这个额外的代码放在我的视图控制器中,试图获得更多关于正在发生的事情的信息(并试图影响操作表的大小):
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
{
NSLog(@"willPresentActionSheet with frame %@ and bounds %@", NSStringFromCGRect(actionSheet.frame),
NSStringFromCGRect(actionSheet.bounds));
CGRect rect = actionSheet.frame;
rect.size.width = 400.0;
actionSheet.frame = rect;
}
- (void)didPresentActionSheet:(UIActionSheet *)actionSheet
{
NSLog(@"didPresentActionSheet with frame %@ and bounds %@", NSStringFromCGRect(actionSheet.frame),
NSStringFromCGRect(actionSheet.bounds));
}
尝试更改操作表的框架当然没有效果,这是上面控制台中的输出:
2013-07-15 19:32:58.662 MyApp[12953:907] willPresentActionSheet with frame {{0, 0}, {272, 341}} and bounds {{0, 0}, {272, 341}}
2013-07-15 19:32:58.677 MyApp[12953:907] didPresentActionSheet with frame {{0, 0}, {272, 327}} and bounds {{0, 0}, {272, 327}}
2013-07-15 19:33:08.075 MyApp[12953:907] willPresentActionSheet with frame {{0, 0}, {0, 324}} and bounds {{0, 0}, {0, 324}}
2013-07-15 19:33:08.080 MyApp[12953:907] didPresentActionSheet with frame {{0, 0}, {0, 310}} and bounds {{0, 0}, {0, 310}}
前两行是它正常工作时的结果,从后两行可以看出,由于某种原因,操作表的宽度为 0。