2014-12-10 15 views
5

Voglio chiudere immediatamente, dopo averlo presentato, ma posso farlo solo dopo 2 secondi. Come fare questo?UIAlertController respingere solo dopo 2 secondi

Ecco il mio metodo che viene chiamato da UITapGestureRecognizer su un UILabel.

- (IBAction)labelTaped:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 
    CGRect frame = CGRectNull; 
    NSString *message = nil; 
    // ... 
    // some code 
    /// ... 
    if (message) { 
     // show info alert 
     __weak __typeof(self)weakSelf = self; 
     UIAlertController* alert = [UIAlertController alertControllerWithTitle:nil 
                     message:message 
                   preferredStyle:UIAlertControllerStyleActionSheet]; 

     UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"alert_ok", @" - ") 
                   style:UIAlertActionStyleCancel 
                  handler:^(UIAlertAction * action) { 
                   if ([weakSelf.dismissAlertTimer isValid]) { 
                    [weakSelf.dismissAlertTimer invalidate]; 
                   } 
                  }]; 
     [alert addAction:cancelAction]; 

     UIPopoverPresentationController *popoverController = alert.popoverPresentationController; 
     popoverController.sourceRect = frame; 
     popoverController.sourceView = sender.view; 


     [self.mainController presentViewController:alert animated:YES completion:^{ 
      if ([weakSelf.dismissAlertTimer isValid]) { 
       [weakSelf.dismissAlertTimer invalidate]; 
      } 
      weakSelf.dismissAlertTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:weakSelf selector:@selector(dismissAlertController) userInfo:nil repeats:NO]; 
     }]; 
    } 
    } 
} 

- (void)dismissAlertController { 
    [self.mainController dismissViewControllerAnimated:YES completion:^{ 
     // 
    }]; 
} 

risposta

8

Il più facile sarebbe qualcosa di simile?

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:@"message dismiss in 2 seconds" preferredStyle:UIAlertControllerStyleAlert]; 

[self presentViewController:alertController animated:YES completion:nil]; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 

    [alertController dismissViewControllerAnimated:YES completion:^{ 
     // do something ? 
    }]; 

}); 

O vuoi dire anche voi volete impedire all'utente di toccando il pulsante di annullare prima della due secondi si attiva?

3

Questo dovrebbe funzionare. Ha funzionato per me

let alert = UIAlertController(title: "some title", 
      message: "some message", 
      preferredStyle: .Alert) 
     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
     self.presentViewController(alert, animated: true, completion: nil) 

     dispatch_async(dispatch_get_main_queue()) {() -> Void in 

      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(10 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {() -> Void in 
       alert.dismissViewControllerAnimated(true, completion: nil) 
      }) 
     } 
0

sto respingendo UIAlertController con timeout utilizzando l'estensione. Ecco il codice.

extension UIViewController { 
    func dismissViewController(timer: Timer) { 
    let viewController = timer.userInfo as! UIViewController 
    if (viewController.isViewLoaded && (viewController.view.window != nil)) { 
     viewController.dismiss(animated: true, completion: nil) 
    } 
    } 

    func presentWithTOT(_ viewControllerToPresent: UIViewController, timeout: Double) { 
    if (timeout != 0.0) { 
     Timer.scheduledTimer(timeInterval: timeout, target: self, selector: #selector(dismissViewController), userInfo: viewControllerToPresent, repeats: false) 
    } 
    present(viewControllerToPresent, animated: true, completion: nil) 
    } 
} 

func myfunc() { 
    let alertController = UIAlertController(...) 
    presentWithTOT(alertController, timeout: 2.0) 
} 

Una nota per il codice precedente è che il timer tiene riferimento forte alertController, il che significa che l'oggetto non viene rilasciato fino timeout.

Problemi correlati