UIActionSheet没有显示 - 屏幕变得更暗

时间:2010-08-01 00:24:09

标签: iphone uiactionsheet iphone-sdk-3.0

我有一个基于“基于窗口的应用程序”模板的iPhone应用程序,它使用带有一些嵌入式子视图的主视图。

对于某些操作,我需要用户确认。因此,我创建了一个UIActionSheet并要求用户提供反馈。

问题是,操作表根本没有显示。相反,屏幕变暗。工作表和请求的按钮不显示。之后,应用程序挂起。屏幕变暗是动画的一部分,通常显示动作表。

奇怪的是,如果在viewDidLoad方法中调用,相同的代码可以正常工作。如果在buttonPressed方法中调用它,它将启动需要确认的操作。

- (void) trashButtonPressed {
   // This method is called in the button handler and (for testing
   // purposes) in the viewDidLoad method.
   NSLog( @"trashButtonPressed" );

   UIActionSheet* actionSheet =
        [[UIActionSheet alloc] initWithTitle: @"Test" 
                                    delegate: self 
                           cancelButtonTitle: @"Cancel"
                      destructiveButtonTitle: @"Delete Sheet"
                           otherButtonTitles: nil];

   [actionSheet showInView: self.view];
   [actionSheet release];
}

- (void)       willPresentActionSheet:(UIActionSheet *)  actionSheet {
   NSLog( @"willPresentActionSheet" );
}

- (void)       didPresentActionSheet:(UIActionSheet *)   actionSheet {
   NSLog( @"didPresentActionSheet" );
}

- (void)        actionSheet:(UIActionSheet *)actionSheet
  didDismissWithButtonIndex:(NSInteger)buttonIndex {
   NSLog( @"actionSheet:didDismissWithButtonIndex" );
}

如您所见,我已将一些日志消息添加到UIActionSheetDelegateProtocol的协议处理程序中。

有人知道,这里有什么不对吗?

2 个答案:

答案 0 :(得分:3)

我想知道[actionSheet showInView: self.view];是否足以让actionSheet自己保留self.view。编辑:保留计数从1跳到4所以这不是问题)

您是否检查了视图的尺寸?工作表位于视图中,但如果self.view将引用大型滚动视图,则表面下方可能只有一个工作表。简而言之,您确定self.view.frame和self.view.bounds在您指的两种情况下具有相同的值吗?它是相同的视图(只有NSLog(@"%x",self.view) - 它的地址)?

修改以澄清:做

NSLog(@"%f %f %f %f",
        self.view.frame.origin.x,self.view.frame.origin.y,
        self.view.frame.size.width,self.view.frame.size.height);

请告诉您在控制台上看到的内容。如果我设置0,0,0,0帧或0,0,320,800帧,我会让你的“屏幕变暗”,所以这可能就是......

答案 1 :(得分:0)

实际上,我认为你遇到了我见过的同样问题。

在iOS 8& 9,UIActionSheet 显示...哦......但在屏幕键盘后面,所以你看不到它。你只看到屏幕的其余部分变暗。

显然,这是Apple最新的UI改进理念,以保持屏幕整洁。 ; - )

简单的解决方案是在显示UIActionSheet

之前添加一行代码
[self.view endEditing:true];

这会取消屏幕键盘,让你的美丽动作表再次可见。

或者,我documented here如何将UIActionSheet替换为UIAlertController