title: UIActionSheet crash in iOS8beta
body: <p>I have code which simply display UIActionSheet on button click.
  but it will crash when I build it using XCode5.1 + iOS8beta in iPad.</p>
  
  <p>below is a code I used to display UIActionSheet.</p>
  
  <pre><code>UIActionSheet *tmpActionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                                  delegate:self
                                                         cancelButtonTitle:@"Cancel"
                                                    destructiveButtonTitle:nil
                                                         otherButtonTitles:
                                       @"Ok",
                                       nil];
      [tmpActionSheet showInView:self.view];
  </code></pre>
  
  <p>Note: <br>
  - It perfectly work with XCode6beta + iOS8beta (iPhone/iPad both)<br>
  - It perfectly work with XCode5.1 + iOS8beta (iPhone only)<br></p>
  
  <p>Log while exception is came is as below.<br></p>
  
  <pre><code>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) 
  (
      "&lt;NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0]   (Names: '|':UIView:0x14d3a8b0 )&gt;",
      "&lt;NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top&gt;",
      "&lt;NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(&gt;=44)]&gt;",
      "&lt;NSLayoutConstraint:0x14e66240 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;"
  )
  
  Will attempt to recover by breaking constraint 
  &lt;NSLayoutConstraint:0x14e66240 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;
  
  Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
  The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &lt;UIKit/UIView.h&gt; 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) 
  (
      "&lt;NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0]   (Names: '|':UIView:0x14d3a8b0 )&gt;",
      "&lt;NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top&gt;",
      "&lt;NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(&gt;=44)]&gt;",
      "&lt;NSLayoutConstraint:0x14d25f80 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;"
  )
  
  Will attempt to recover by breaking constraint 
  &lt;NSLayoutConstraint:0x14d25f80 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;
  
  Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
  The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &lt;UIKit/UIView.h&gt; 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) 
  (
      "&lt;NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0]   (Names: '|':UIView:0x14d3a8b0 )&gt;",
      "&lt;NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top&gt;",
      "&lt;NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(&gt;=44)]&gt;",
      "&lt;NSLayoutConstraint:0x14e67740 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;"
  )
  
  Will attempt to recover by breaking constraint 
  &lt;NSLayoutConstraint:0x14e67740 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;
  
  Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
  The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &lt;UIKit/UIView.h&gt; 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) 
  (
      "&lt;NSLayoutConstraint:0x14e60ef0 V:|-(0)-[UIView:0x14d419a0]   (Names: '|':UIView:0x14d3a8b0 )&gt;",
      "&lt;NSLayoutConstraint:0x14e60880 _UIDimmingKnockoutBackdropView:0x14d2ca80.top == UIView:0x14d419a0.top&gt;",
      "&lt;NSLayoutConstraint:0x14e61600 V:[_UIDimmingKnockoutBackdropView:0x14d2ca80(&gt;=44)]&gt;",
      "&lt;NSLayoutConstraint:0x14d38a30 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;"
  )
  
  Will attempt to recover by breaking constraint 
  &lt;NSLayoutConstraint:0x14d38a30 _UIDimmingKnockoutBackdropView:0x14d2ca80.bottom ==&gt;
  
  Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
  The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &lt;UIKit/UIView.h&gt; 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 &lt;_UIAlertShimPresentingViewController: 0x14d450c0&gt;.'
  *** 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
  </code></pre>
  
  <p><hr><br>
  Question : <br>
  1] Why my application is crash ?<br>
  2] Is it iOS8beta bug ?</p>
  
  <p><hr>
  <strong>Patch till apple fix this issue</strong><br>
  Create  <code>Objective-C categor</code> for <code>UIActionSheet</code> class</p>
  
  <p><strong>CODE :</strong></p>
  
  <pre><code>#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&lt;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 &amp;&amp; [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];
      }
  }
  </code></pre>
  
  <p>Reference <a href="https://devforums.apple.com/message/1030406#1030406" rel="nofollow">link</a></p>