web-dev-qa-db-fra.com

Ajouter une barre d'outils à UITableViewController

Quelle est la façon la plus simple d'ajouter UIToolBar à UITableViewController? Je dépends de la fonctionnalité d'édition, donc je ne peux pas facilement changer UITableViewController en UIViewController.

37
Farcaller

Pas de problème du tout, UITableViewController est une sous-classe de UIViewController. Et il se trouve que dans iPhone OS 3.0, tout UIViewController(et sous-classes) peut fonctionner en conjonction avec un UINavigationController pour fournir une barre d'outils contextuelle.

Pour que cela fonctionne, vous devez:

  • Assurez-vous que vous utilisez un UINavigationController pour contenir tous vos contrôleurs de vue qui ont besoin d'une barre d'outils.
  • Définissez la propriété toolbarsItems du contrôleur de vue qui souhaite une barre d'outils.

C'est presque aussi simple que de définir le titre du contrôleur de vue, et devrait être fait de la même manière. Très probablement en remplaçant le initWithNibName:bundle: initialiseur. Par exemple:

-(id)initWithNibName:(NSString*)name bundle:(NSBundle*)bundle;
{
  self = [super initWithNibName:name bundle:bundle];
  if (self) {
    self.title = @"My Title";
    NSArray* toolbarItems = [NSArray arrayWithObjects:
        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                                                      target:self
                                                      action:@selector(addStuff:)],
        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch 
                                                      target:self
                                                      action:@selector(searchStuff:)],
        nil];
    [toolbarItems makeObjectsPerformSelector:@selector(release)];
    self.toolbarItems = toolbarItems;
    self.navigationController.toolbarHidden = NO;
  }
  return self;
}

Vous pouvez aussi utiliser setToolbarItems:animated: au lieu de l'assigner à la propriété toolbarItems, pour ajouter et supprimer des éléments de barre d'outils de façon animée à la volée.

51
PeyloW

Pour que la recette de PeyloW fonctionne, j'ai dû ajouter la ligne de code supplémentaire suivante:

self.navigationController.toolbarHidden = NO;

J'espère que cela pourra aider...

40
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    //Initialize the toolbar
    toolbar = [[UIToolbar alloc] init];
    toolbar.barStyle = UIBarStyleDefault;

    //Set the toolbar to fit the width of the app.
    [toolbar sizeToFit];

    //Caclulate the height of the toolbar
    CGFloat toolbarHeight = [toolbar frame].size.height;

    //Get the bounds of the parent view
    CGRect rootViewBounds = self.parentViewController.view.bounds;

    //Get the height of the parent view.
    CGFloat rootViewHeight = CGRectGetHeight(rootViewBounds);

    //Get the width of the parent view,
    CGFloat rootViewWidth = CGRectGetWidth(rootViewBounds);

    //Create a rectangle for the toolbar
    CGRect rectArea = CGRectMake(0, rootViewHeight - toolbarHeight, rootViewWidth, toolbarHeight);

    //Reposition and resize the receiver
    [toolbar setFrame:rectArea];

    //Create a button
    UIBarButtonItem *infoButton = [[UIBarButtonItem alloc]
                                   initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(info_clicked:)];

    [toolbar setItems:[NSArray arrayWithObjects:infoButton,nil]];

    //Add the toolbar as a subview to the navigation controller.
    [self.navigationController.view addSubview:toolbar];



[[self tableView] reloadData];

}

- (void) info_clicked:(id)sender {


 [self.navigationController popViewControllerAnimated:YES];
    [toolbar removeFromSuperview];

    }

Et en Swift 3:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    //Initialize the toolbar
    let toolbar = UIToolbar()
    toolbar.barStyle = UIBarStyle.default

    //Set the toolbar to fit the width of the app.
    toolbar.sizeToFit()

    //Caclulate the height of the toolbar
    let toolbarHeight = toolbar.frame.size.height

    //Get the bounds of the parent view
    let rootViewBounds = self.parent?.view.bounds

    //Get the height of the parent view.
    let rootViewHeight = rootViewBounds?.height

    //Get the width of the parent view,
    let rootViewWidth = rootViewBounds?.width

    //Create a rectangle for the toolbar
    let rectArea = CGRect(x: 0, y: rootViewHeight! - toolbarHeight, width: rootViewWidth!, height: toolbarHeight)

    //Reposition and resize the receiver
    toolbar.frame = rectArea

    //Create a button
    let infoButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(infoClicked))

    toolbar.items = [infoButton]

    //Add the toolbar as a subview to the navigation controller.
    self.navigationController?.view.addSubview(toolbar)
}

func infoClicked() {
    //Handle Click Here
}
14
user283846