2009-05-26 6 views
18

Je souhaite créer un menu contextuel similaire à celui de l'application de messagerie lorsque vous souhaitez répondre à un message. J'ai vu cela dans plus d'une application, donc je n'étais pas sûr s'il y avait quelque chose intégré dans le cadre ou un exemple de code là-bas.Création d'un menu contextuel iPhone similaire à Mail App Menu

UIActionSheet example

+0

meilleure ressource j'ai trouvé ici http://code.tutsplus.com/tutorials/uiactionsheet-and-uiactionsheetdelegate--mobile-11590 – Nepster

Répondre

14

Consultez l'exemple UICatalog sur le site Web d'Apple. La section "Alertes" contient des exemples d'utilisation de UIActionSheet pour accomplir ce que vous essayez de faire.

9

Vous devez utiliser une feuille UIAction.

Vous devez d'abord ajouter UIActionSheetDelegate à votre fichier ViewController .h.

Ensuite, vous pouvez faire référence à un actionsheet avec:

UIActionSheet *popup = [[UIActionSheet alloc] initWithTitle:@"Select Sharing option:" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: 
         @"Share on Facebook", 
         @"Share on Twitter", 
         @"Share via E-mail", 
         @"Save to Camera Roll", 
         @"Rate this App", 
         nil]; 
    popup.tag = 1; 
    [popup showInView:self.view]; 

Ensuite, vous devez gérer chacun des appels.

- (void)actionSheet:(UIActionSheet *)popup clickedButtonAtIndex:(NSInteger)buttonIndex { 

    switch (popup.tag) { 
    case 1: { 
     switch (buttonIndex) { 
      case 0: 
       [self FBShare]; 
       break; 
      case 1: 
       [self TwitterShare]; 
       break; 
      case 2: 
       [self emailContent]; 
       break; 
      case 3: 
       [self saveContent]; 
       break; 
      case 4: 
       [self rateAppYes]; 
       break; 
      default: 
       break; 
     } 
     break; 
    } 
    default: 
     break; 
} 
} 

Ceci a été abandonné à partir d'iOS 8.x.

https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIAlertController_class/index.html

2

Pour tous ceux qui est à la recherche d'une solution à Swift:

  1. Adopt UIActionSheetDelegate protocole

  2. Créer et montrer la ActinSheet:

    let sheet: UIActionSheet = UIActionSheet() 
    
    sheet.addButtonWithTitle("button 1") 
    sheet.addButtonWithTitle("button 2") 
    sheet.addButtonWithTitle("button 3") 
    sheet.addButtonWithTitle("Cancel") 
    sheet.cancelButtonIndex = sheet.numberOfButtons - 1 
    sheet.delegate = self 
    sheet.showInView(self.view) 
    
  3. Le déléguer functi sur:

    func actionSheet(actionSheet: UIActionSheet!, clickedButtonAtIndex buttonIndex: Int){ 
    switch buttonIndex{ 
        case 0: 
         NSLog("button1"); 
        case 1: 
         NSLog("button2"); 
        case 2: 
         NSLog("button3"); 
        case actionSheet.cancelButtonIndex: 
         NSLog("cancel"); 
         break; 
        default: 
         NSLog("blub"); 
         break; 
        } 
    } 
    
19

Création d'une fiche d'action à Swift

code a été mis à jour pour Swift 3

enter image description here

Depuis iOS 8, UIAlertController combiné avec UIAlertControllerStyle.ActionSheet est utilisé . UIActionSheet est obsolète.

Voici le code pour produire la feuille d'action dans l'image ci-dessus:

class ViewController: UIViewController { 

    @IBOutlet weak var showActionSheetButton: UIButton! 

    @IBAction func showActionSheetButtonTapped(sender: UIButton) { 

     // Create the action sheet 
     let myActionSheet = UIAlertController(title: "Color", message: "What color would you like?", preferredStyle: UIAlertControllerStyle.actionSheet) 

     // blue action button 
     let blueAction = UIAlertAction(title: "Blue", style: UIAlertActionStyle.default) { (action) in 
      print("Blue action button tapped") 
     } 

     // red action button 
     let redAction = UIAlertAction(title: "Red", style: UIAlertActionStyle.default) { (action) in 
      print("Red action button tapped") 
     } 

     // yellow action button 
     let yellowAction = UIAlertAction(title: "Yellow", style: UIAlertActionStyle.default) { (action) in 
      print("Yellow action button tapped") 
     } 

     // cancel action button 
     let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel) { (action) in 
      print("Cancel action button tapped") 
     } 

     // add action buttons to action sheet 
     myActionSheet.addAction(blueAction) 
     myActionSheet.addAction(redAction) 
     myActionSheet.addAction(yellowAction) 
     myActionSheet.addAction(cancelAction) 

     // support iPads (popover view) 
     myActionSheet.popoverPresentationController?.sourceView = self.showActionSheetButton 
     myActionSheet.popoverPresentationController?.sourceRect = self.showActionSheetButton.bounds 

     // present the action sheet 
     self.present(myActionSheet, animated: true, completion: nil) 
    } 
} 

encore besoin d'aide? Regardez ce tutoriel vidéo. C'est comme ça que je l'ai appris.

  • UIActionSheet example in Swift (Contrairement au nom, il ne fait utiliser la nouvelle feuille d'action UIAlertController plutôt que UIActionSheet.)
+0

Salut @Suragch, j'essaye votre code. Cela fonctionne pour moi sur iPad et iPod. Mais, le bouton Annuler n'apparaît pas sur l'iPad. Je ne sais pas pourquoi. Il montre dans l'iPod et je n'utilise pas de bouton. J'utilise l'image et j'y ajoute la fonction tap. Donc, mon code est alertController.popoverPresentationController? .sourceView = self.imgPlay et alertController.popoverPresentationController? .sourceRect = self.imgPlay.bounds. –

+0

Cela fonctionne très bien, mais pouvons-nous personnaliser les boutons texte @Suragch –

5

Voici comment vous le feriez en Objective-C sur iOS 8+:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Directions" 
                      message:@"Select mode of transportation:" 
                    preferredStyle:UIAlertControllerStyleActionSheet]; 
    UIAlertAction *drivingAction = [UIAlertAction actionWithTitle:@"Driving" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 
     // this block runs when the driving option is selected 
    }]; 
    UIAlertAction *walkingAction = [UIAlertAction actionWithTitle:@"Walking" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 
     // this block runs when the walking option is selected 
    }]; 
    UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]; 
    [alert addAction:drivingAction]; 
    [alert addAction:walkingAction]; 
    [alert addAction:defaultAction]; 
    [self presentViewController:alert animated:YES completion:nil]; 
0

J'ai essayé d'ajouter ActionSheet sur mon point de vue. J'ai donc essayé de trouver une solution parfaite mais certaines réponses m'ont rendu confus. Parce que la plupart des questions sur la feuille d'action ont été écrites il y a si longtemps. De plus, elle n'a pas été mise à jour. Quoi qu'il en soit ... Je vais écrire l'ancienne version ActionSheet et la version mise à jour ActionSheet. J'espère que ma réponse est capable de rendre votre cerveau paisible.

---------- Version mise à jour ---------

UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"Action Sheet" message:@"writeMessageOrsetAsNil" preferredStyle:UIAlertControllerStyleActionSheet]; 

    UIAlertAction* actionSheet01 = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault 
                   handler:^(UIAlertAction * action) { NSLog(@"OK click");}]; 

    UIAlertAction* actionSheet02 = [UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleDefault 
                   handler:^(UIAlertAction * action) {NSLog(@"OK click");}]; 

    UIAlertAction* actionSheet03 = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel 
                   handler:^(UIAlertAction * action) { 
                    NSLog(@"Cancel click");}]; 

    [browserAlertController addAction:actionSheet01]; 
    [browserAlertController addAction:actionSheet02]; 
    [browserAlertController addAction:actionSheet03]; 

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

------- ------ ancienne version

UIActionSheet *actionSheet= [[UIActionSheet alloc] initWithTitle:@"Select Sharing option:" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@“OK”, @“NO”,@“Cancel”, 
         nil]; 
    actionSheet.tag = 100; 
    [actionSheet showInView:self.view]; 

- (void)actionSheet:(UIActionSheet *)actionShee clickedButtonAtIndex:(NSInteger)buttonIndex { 

    if(actionSheet.tag == 100){ 
     switch (buttonIndex) { 
      case 0: 
       [self doSomething]; 
       break; 
      case 1: 
       [self doAnything]; 
       break; 
      case 2: 
       [self doNothing]; 
       break; 
      default: 
       break; 
     } 
     break; 
    } 

}