我的代码只需点击按钮即可显示UIActionSheet。 但是当我在iPad中使用XCode5.1 + iOS8beta构建它时会崩溃。
下面是我用来显示UIActionSheet的代码。
UIActionSheet *tmpActionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:
@"Ok",
nil];
[tmpActionSheet showInView:self.view];
注意:
- 完美适用于XCode6beta + iOS8beta(iPhone / iPad)
- 它完全适用于XCode5.1 + iOS8beta(仅限iPhone)
异常发生时的记录如下。
2014-06-23 15:54:04.860 ActionSheetDemo[680:191598] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0] (Names: '|':UIView:0x14d3a8b0 )>",
"<NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top>",
"<NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(>=44)]>",
"<NSLayoutConstraint:0x14e66240 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x14e66240 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2014-06-23 15:54:04.872 ActionSheetDemo[680:191598] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0] (Names: '|':UIView:0x14d3a8b0 )>",
"<NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top>",
"<NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(>=44)]>",
"<NSLayoutConstraint:0x14d25f80 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x14d25f80 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2014-06-23 15:54:04.878 ActionSheetDemo[680:191598] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0] (Names: '|':UIView:0x14d3a8b0 )>",
"<NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top>",
"<NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(>=44)]>",
"<NSLayoutConstraint:0x14e67740 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x14e67740 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2014-06-23 15:54:04.885 ActionSheetDemo[680:191598] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0] (Names: '|':UIView:0x14d3a8b0 )>",
"<NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top>",
"<NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(>=44)]>",
"<NSLayoutConstraint:0x14d38a30 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x14d38a30 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2014-06-23 15:54:04.892 ActionSheetDemo[680:191598] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <_UIAlertShimPresentingViewController: 0x14d450c0>.'
*** First throw call stack:
(0x24702c2f 0x315cdd1f 0x27ffa6e7 0x27df9799 0x2838f3bd 0x2838e94d 0x6bfdd 0x27d4a6c7 0x27d4a669 0x27d34a4d 0x27d4a099 0x27d49d73 0x27d42ff1 0x27d198b1 0x27f8f13d 0x27d183c1 0x246ca597 0x246c99ab 0x246c8029 0x246145a1 0x246143b3 0x2b8cc1b9 0x27d78c41 0x6c239 0x31b67aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException
<小时/> 补丁直到苹果解决了这个问题
Objective-C categor
类创建
UIActionSheet
代码:
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
@implementation UIActionSheet (simplyShowInViewAddition)
- (void) simplyShowInView:(UIView *) view
{
if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
{
[self showInView:view];
}
else
{
// "Translating" UIActionSheet to UIAlertController for better compatibility with iOS 8
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:self.title preferredStyle:UIAlertControllerStyleActionSheet];
int nactions = [self numberOfButtons];
int i=0;
while(i<nactions)
{
NSString *button_title=[self buttonTitleAtIndex:i];
UIAlertActionStyle style=UIAlertActionStyleDefault;
if(i==[self cancelButtonIndex])
{
style = UIAlertActionStyleCancel;
}
else if(i==[self destructiveButtonIndex])
{
style = UIAlertActionStyleDestructive;
}
UIAlertAction *newAction = [UIAlertAction actionWithTitle:button_title style:style handler:^(UIAlertAction *action) {
NSLog(@"clicked action %d",i);
[self.delegate actionSheet:self clickedButtonAtIndex:i];
}];
[alert addAction:newAction];
i++;
}
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
[alert setModalPresentationStyle:UIModalPresentationPopover];
UIPopoverPresentationController *popPresenter = [alert
popoverPresentationController];
popPresenter.sourceView = view;
popPresenter.sourceRect = CGRectMake(view.frame.size.width/2-1, 0.45*view.frame.size.height, 2, 1);
popPresenter.permittedArrowDirections = 0;
}
UIViewController *sourceViewController;
if(self.delegate!=nil && [self.delegate respondsToSelector:@selector(presentViewController:animated:completion:)])
{
NSLog(@"presenting UIAlertController on source view controller");
sourceViewController=(UIViewController *)(self.delegate);
}
else
{
// When the actionsheet delegate is not a UIViewController
NSLog(@"presenting UIAlertController on displayed view controller");
sourceViewController = /* Set up a method here to obtain the view controller where you want to display it */
}
[sourceViewController presentViewController:alert animated:YES completion:nil];
}
}
参考link
答案 0 :(得分:5)
我也有同样的问题。我使用 ShowFromBarButtonItem 函数而不是ShowInView函数。
[organizeActionSheet showFromBarButtonItem:btnAction animated:NO];
如果使用ShowFromRect或showFromBarButtonItem运行时异常将不会出现。 我认为这是IOS8 Beta的一个错误,当我使用ShowInView Runtime异常即将到来时。
IOS Beta 4中没有发生此错误。
使用Xcode 5.1构建时,我在调试窗口中收到一些警告消息,但确实显示了操作表。在iOS 8 beta 4中,它在视图外侧(在侧面)显示为一个小弹出窗口,而在iOS 7中,它曾经显示为从视图底部向上滑动的按钮。
答案 1 :(得分:1)
我遇到了同样的问题,这在测试版5中仍然“破损”。在我的情况下,虽然我只是在没有操作表的情况下获得了一个灰暗的屏幕而不是崩溃。
除了直接在iPad上查看动作表外,无论如何都不是一个好的设计。您应该使用包含操作表的popover并指向产生Sabareesh建议的选项的按钮或UI元素。警报适用于与任何UI元素断开连接的消息,据我所知,操作表始终与屏幕上的UI元素相关联。
答案 2 :(得分:0)
我已经看到同样的问题,因为showInView无法从IOS 8 Beta 2到Beta 5工作。我刚刚提交了错误报告:17971746。
答案 3 :(得分:0)
我在iPad上的iOS8决赛中也遭遇了崩溃。
这是我的简单解决方法:
更换
[actionSheet showFromBarButtonItem:myButton animated:YES];
通过
[actionSheet showFromRect:myButton.navBarView.frame inView:self.view animated:YES];
答案 4 :(得分:0)