7
votes

UIBARBUTTONITEM AVEC UIBUTTON AS CUSTONNERVIEW - D'UIBUTON, comment accéder à l'UIBARBUTTONITEM STI est?

J'ai un uibarbuttonitem avec uibutton comme vue personnalisée.

Le uibutton a un addTtarget: action: dessus. Dans l'action, je présente une colleure. Je présente actuellement à partir du Sender.frame (la trame uibutton s) que je veux présenter à partir du uibarbuttonitem à la place.

Comment puis-je accéder au uibarbuttonitem à partir du uibutton ?


0 commentaires

5 Réponses :


6
votes

Tout d'abord, pourquoi avez-vous besoin d'accéder au uibarbuttonitem ?

alors, pour créer un uibarbuttonitem avec une vue personnalisée, je vous suggère de créer une catégorie Extension Comme ci-dessous (dans ce cas, la vue personnalisée est un uibutton ). xxx

et l'utiliser comme ceci (première importation Uibarbuttonitem + extension.h ): xxx

où le sélecteur est une méthode implémentée à l'intérieur de la classe (la cible) qui utilise ce bouton de barre. < / p>

maintenant à l'intérieur du dossage Dosomething: Sélecteur Vous pouvez le suivant: xxx

une catégorie dans ce cas, il est utile de ne pas dupliquer le code . J'espère que cela aide.

P.s. Je n'utilise pas d'arc, mais les mêmes considérations peuvent également être appliquées.

EDIT:

Une solution facile pour accéder à l'élément de bouton de barre pourrait être le suivant :

  1. Sous-classe A UIBUTON
  2. Créez-le dans une propriété de type uibarbuttonitem (un faible à éviter de retenir)
  3. injecter l'élément de bouton de barre dans le uibutton lorsque vous le créez.

    Peut-être que cela pourrait fonctionner, mais je préférerai le premier.


1 commentaires

J'ai quelque chose de similaire à votre code, bien que j'ai fait une sous-classe d'uibarbuttonitem comme l'aspect et la sensation du bouton est assez personnalisée. Le problème est le `[Popover PresentPoppoverfrromrect: SenderButton.bounds Senview: Senderbutton ...]; ' Cela nécessite un peu de travail de positionnement de la population à la rotation, au clavier, etc. La pondéreuse peut être présentée d'un Uibarbuttonitem élimine tout cela et toujours des ancres à l'Uibarbuttonitem.



0
votes

Je ne sais pas que vous avez besoin de l'UIBUTTON. Si ce que vous faites est d'envoyer une action, ou même personnaliser le bouton avec une image, le uibarbuttonitem devrait suffire.

Si ce que vous êtes après est de saisir le cadre du UIBUTTON Pour réaliser la présentation, je pense que vous pourriez être mieux servi à estimer simplement la position du uibarbuttonitem . Cela ne devrait pas être trop difficile, surtout si c'est l'un ou l'autre de votre uinavigentitem 'S de gauchebarbuttonitem ou droitebarbuttonitem . < P> Je suis généralement pour le baiser (gardez-le simple, stupide!) Règle du pouce. Même Apple fait ceci ... Lorsque vous lancez une application à partir de Springboard, l'application se développe toujours du centre de l'écran et non de l'icône de l'application.

juste une suggestion.

Edit

OK, je viens de lire le uipoppovercontroller référence (je n'ai jamais utilisé une). Je pense que ce que vous voulez, c'est PresentPoppoverFrombarButtonitem: PermitearrowDirections: animée: et pour transmettre votre BBI comme premier paramètre. La raison pour laquelle la méthode existe consiste à résoudre votre problème - les BBI n'ont pas de cadre car ils ne sont pas sous-classes Nsview. Apple sait que vous voulez faire ce genre de chose et fournit cette méthode. En outre, je pense que si vous utilisez cette méthode, votre autorotation fonctionnera également. Je me trompe peut-être à ce sujet, donnez-lui un coup.

En ce qui concerne votre mise en page personnalisée, je pense que si vous le répliquez dans un UIView et que vous faites la coutume BBI avec cela, vous ferez mieux. Ceci est bien sûr à vous de choisir.

de toute façon, vous obtenez une référence à la BBI en le connectant comme une iboutlet avec votre NIB, ou en enregistrant une référence à ce que vous le créez dans le code. Ensuite, passez cette référence à la méthode Popover que j'ai décrite ci-dessus. Je pense que cela pourrait fonctionner pour vous.

Moar

Le BBI n'est qu'un membre de votre classe - un ivar avec une propriété de référence forte à ce sujet, peut-être relié à Iboutlet à votre nib. Ensuite, vous pouvez y accéder à partir de toute méthode que vous souhaitez dans la classe.

Exemple: (Vous n'êtes pas sûr que j'ai le droit de gestion de la mémoire du contrôleur de popover) xxx


7 commentaires

Le vrai problème est ma popover qui est présentée de l'action de l'Uibutton. Lorsque je fais pivoter l'écran, le pongeon n'est pas ancré à l'Uibarbuttonitem, son ancré au cadre de l'expéditeur de l'action, qui est l'Uibutton. J'avais besoin de l'UIBUTTON car mon uitoolbar est personnalisé, les boutons sont 84x48 sur le fond, 3 boutons, l'espace flexible, 4 boutons. L'UIBUTON me permet d'avoir le barbuttonitem avoir un graphique personnalisé et une étiquette dans des positions spécifiques dans le 84x48.


Étant donné que les porcovers présentés de Barbuttonitems n'ont pas le problème de positionnement, je pensais pouvoir faire une expéditeur.superview sur l'Uibutton et obtenir l'uibarbuttonitem. Au lieu de cela, je reçois l'uitoolbar. J'ai la position du bouton comme étiquette, puis-je simplement traverser l'uitoolbar pour l'uibarbuttonitem?


Désolé pour ça. Si vous présentez votre popover à l'aide de la méthode, j'ai indiqué ci-dessus, PresentPoppoverFrombarButtonItem: PermiteRrowDirections: Ani Mode: , la Popover sera automatiquement repositionnée, le cas échéant pendant les changements d'orientation du périphérique.


Exactement! Comment puis-je avoir accès à l'uibarbuttonitem? Le barbouttonitem que j'ai est introduit avec CusomView, qui est un Uibutton. L'Uibutton a l'addTtarget dessus. Donc, lorsque vous appuyez sur le bouton, c'est l'expéditeur à l'action. Une fois dans l'action, j'aimerais avoir accès à l'Uibarbuttonitem. La seule façon dont je suis arrivé est de sous-classer l'UIBUTTON, ajoutez un ivar pour l'uibarbuttonitem, et définissez-le lorsque j'y introche le bouton.


Désolé, je n'ai pas réalisé tout votre édition. Je devrai voir d'utiliser un UIView ou UiImageView comme point de vue personnalisé contre l'UIBUTTON. J'ai juste aimé l'Uibutton comme il nuque les images avec des points forts, sélectionnés, normaux, désactivés. Toutes lesquelles j'utilise une couleur différente pour représenter l'état. J'ai également ajouté un Uilabel comme une sous-vision de l'Uibutton pour un placement différent du texte du titre. Ce texte diminue également lorsqu'il est désactivé.


J'ai ajouté les choses sous Moar juste maintenant. Si vous utilisez l'UIBUTTON, vous devriez toujours pouvoir conserver une référence à la BBI lorsque vous le créez.


J'aurais besoin du uibarbuttonitem lié ​​au uibutton comme je l'ai, pour le moment, 7 uibarbuttonitem s



10
votes

Si vous avez défini votre uibutton code> comme CustomVoir code> d'un uibarbuttonitem code> ou un enfant de la vue personnalisée, vous pouvez alors marcher La hiérarchie de vue de votre bouton jusqu'à trouver le uitoolbar code> ou uinavigationbar code> contenant le bouton, puis recherchez les éléments de la barre pour celui dont la vue personnalisée est le bouton (ou un ancêtre du bouton).

Voici mon code complètement non testé pour le faire. Vous appelleriez [[auto classe] Barbuttonitemforview: mybutton] code> pour obtenir l'élément contenant votre bouton. P>

+ (BOOL)ifBarButtonItem:(UIBarButtonItem *)item containsView:(UIView *)view storeItem:(UIBarButtonItem **)outItem {
    UIView *customView = item.customView;
    if (customView && [view isDescendantOfView:customView]) {
        *outItem = item;
        return YES;
    } else {
        return NO;
    }
}

+ (BOOL)searchBarButtonItems:(NSArray *)items forView:(UIView *)view storeItem:(UIBarButtonItem **)outItem {
    for (UIBarButtonItem *item in items) {
        if ([self ifBarButtonItem:item containsView:view storeItem:outItem])
            return YES;
    }
    return NO;
}

+ (UIBarButtonItem *)barButtonItemForView:(UIView *)view {
    id bar = view;
    while (bar && !([bar isKindOfClass:[UIToolbar class]] || [bar isKindOfClass:[UINavigationBar class]])) {
        bar = [bar superview];
    }
    if (!bar)
        return nil;

    UIBarButtonItem *item = nil;

    if ([bar isKindOfClass:[UIToolbar class]]) {
        [self searchBarButtonItems:[bar items] forView:view storeItem:&item];
    }

    else {
        UINavigationItem *navItem = [bar topItem];
        if (!navItem)
            return nil;
        [self ifBarButtonItem:navItem.backBarButtonItem containsView:view storeItem:&item]
        || [self ifBarButtonItem:navItem.leftBarButtonItem containsView:view storeItem:&item]
        || [self ifBarButtonItem:navItem.rightBarButtonItem containsView:view storeItem:&item]
        || ([navItem respondsToSelector:@selector(leftBarButtonItems)]
            && [self searchBarButtonItems:[(id)navItem leftBarButtonItems] forView:view storeItem:&item])
        || ([navItem respondsToSelector:@selector(rightBarButtonItems)]
            && [self searchBarButtonItems:[(id)navItem rightBarButtonItems] forView:view storeItem:&item]);
    }

    return item;
}


1 commentaires

Tu es l'homme! Je n'ai pas été en mesure de tester les navigations comme j'utilise un uitoolbar. Cela fonctionne très bien! Merci!



0
votes

Disons que vous avez ajouté l'Uibutton Abutton à uibarbuttonitem Info_button comme suit:

- (IBAction)showInfo:(id)sender
{   
    [self.flipsidePopoverController presentPopoverFromBarButtonItem:info_Button   permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}


0 commentaires

0
votes
// get the UIBarButtonItem from the UIButton that is passed in sender
UIToolbar *toolbar = (id)[sender superview];
UIBarButtonItem *ourButtonItem = [toolbar items][2];//pick the right index
[parkingPopOver_ presentPopoverFromBarButtonItem:ourButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

0 commentaires