2010-10-28 8 views
1

J'utilise Monotouch pour développer une application pour iPhone.L'application iPhone InputAccessoryView n'apparaît pas sur l'iPad

Dans mon application pour iPhone seulement, un InputAccessoryView apparaît chaque fois que l'utilisateur sélectionne un champ de texte. La vue des accessoires fournit des boutons qui aident l'utilisateur (annuler/refaire, etc.).

Il fonctionne de manière fantastique sur le simulateur et sur les appareils iPhone.

Cependant, à l'improviste, la vue Accessoire d'entrée n'apparaît pas sur l'iPad. Je n'ai fait aucun changement au code concernant les vues; J'ai même ramené à une version que connaissait affiché la vue des accessoires correctement.

Je me demandais si quelqu'un d'autre a rencontré ce comportement avant/je saurais pourquoi cela se produit?

EDIT

J'ai vu cette tous Pose de mes projets en cours d'exécution sur iphone ipad. J'ai fait un nouveau projet qui ne contient que 1 vue, un UITextField et remplace la vue d'accessoire d'entrée et je ne vois toujours rien.

code J'utilise pour tester la substitution de la vue d'entrée est:

public override UIView InputAccessoryView 
{ 
    get 
    { 
     UIView view = new UIView(new RectangleF(0,0,320,30)); 
     view.BackgroundColor = UIColor.Blue; 
     return view; 
    } 
} 

Rien de trop complexe, sur l'iPhone retourne juste une barre bleue au-dessus du clavier.

J'ai réinstallé plusieurs fois Mono, MonoDevelop, Monotouch et iOS SDK en vain. Les applications que j'ai téléchargées depuis le magasin affichent toujours la vue des accessoires d'entrée, donc je commence à me demander si c'est un problème avec mon combo SDK Monotouch/iOS? J'utilise Monotouch 3.1.3 personnel et 4.1 iOS SDK - version 2.6 de Mono. Je vais essayer de mettre à jour vers la version 2.8 de Mono.

La chose que je ne comprends pas est pourquoi cela fonctionnerait auparavant, puis tout d'un coup juste arrêter de travailler? Lorsque je déploie le code sur l'iPad, je sélectionne «Reconstruire tout», puis je télécharge sur l'appareil. Peu importe si je choisis Release/Debug en tant que build, tous les deux donnent le même résultat.

EDIT 2

Si je sous-classe un UITextField et passer outre le InputAccessoryView dans cette sous-classe, la vue apparaît sur l'iPad. Cela signifie que le InputAccessoryView en cours de remplacement dans la classe View n'est pas affecté au champ Textfield sur l'ipad. Il semblerait que cela soit résolu dans iOS 4.2 avec Monotouch 3.2!

+0

Pouvez-vous préciser ce que vous faites lorsque vous déployez votre code sur l'iPad? Avez-vous essayé d'exécuter l'application iPhone (non modifiée) sur l'iPad? Ou avez-vous mis en place un nouveau projet iPad, copié le code et ensuite observez que le comportement est différent? Pourriez-vous poster un code/configuration minimal qui reproduit le comportement? – user8472

+0

voir la question mise à jour – Luke

Répondre

2

Ma première suggestion est de réinitialiser l'appareil dans iTunes. Vous l'avez peut-être déjà fait, mais au cas où vous ne l'auriez pas fait, faites-le d'abord (car c'est rapide et facile à faire).

Si cela n'a pas aidé: Pour identifier si c'est un problème avec Monotouch et/ou iOS SDK pourriez-vous répéter ce que vous avez fait ci-dessus en utilisant seulement Cocoa Touch?

I.e., lancez une application basée sur View dans XCode, ajoutez-en une UITextField dans Interface Builder et connectez-la au contrôleur. Voici un code Objective-C correspondant à le faire:

variables d'instance dans votre contrôleur (ajouter à la section @interface dans le fichier <controllername>.h):

IBOutlet UITextField *text; 
UIView *accessory; 

Accrocher le UITextField dans Interface Builder avec le text sortie et puis ajoutez la mise en œuvre suivante de viewDidLoad au contrôleur (la section @implementation dans le fichier <controllername>.m):

- (void)viewDidLoad { 
    accessory = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 30)]; 
    [accessory setBackgroundColor:[UIColor blueColor]]; 
    [text setInputAccessoryView:accessory]; 
    [super viewDidLoad]; 
} 

Si cela affiche correctement la barre bleue, le problème est lié à la configuration de Monotouch. Si ce n'est pas le cas, c'est un problème avec votre appareil.

+0

C'est génial - merci! Je l'ai fait et je reçois une vue accessoire sur l'ipad, ce qui me porte à croire qu'il s'agit d'un problème lié à Monotouch. – Luke

+0

@Luke: Oui, puisque vous avez dit que ça fonctionnait avant de suspecter qu'une mise à jour de Monotouch (et/ou d'iOS et/ou du SDK) a introduit le bug que vous voyez. Je suppose que la meilleure solution est de déposer un rapport de bogue avec Novell et la solution de contournement temporaire pour utiliser une sous-classe "vide" (comme vous l'avez décrit ci-dessus). – user8472

1

Comment montrez-vous votre vue accessoire?

Pouvez-vous essayer de garder une référence à la vue?

Essayez ceci, et laissez-moi savoir si cela échoue:

public class Foo { track UIView statique; }

Et puis lorsque vous créez votre point de vue, le coller dans ce monde:

Foo.track = new MyAccessoryView()

+0

Je l'affiche comme suit: 'UIViewController' avec deux' UITextFields' accrochés via IB. Dans la classe UIViewController, je substitue 'UIView InputAccessoryView' (je crée la vue dans le contour, comme dans ma question). J'ai trouvé que cela affichait les vues. J'ai essayé de garder une référence, sur l'iPhone il a réussi, mais sur l'ipad 'Foo.track' était nul. Donc le remplacement n'est pas appelé sur l'iPad mais sur l'iPhone?- oublié de dire, merci pour l'aide, très apprécié :) – Luke

+0

On dirait que vous avez trouvé la racine du problème, que votre priorité n'est pas appelée. Pourquoi cela arrive est un mystère que vous seul pouvez vous détendre comme vous avez la source ;-) –

2

J'ai eu le même problème où un UITextView contenu dans un UIView montrerait la barre d'accessoires sur le simulateur mais pas sur l'iPhone ou l'iPad. Je fais des choses étranges avec BeginFirstResponder pour permettre de taper n'importe où dans la plus grande zone parente (contenant une étiquette et le champ de texte) et d'activer le champ contenu et je suppose que cela était en cause. J'ai ajouté le code dans le parent UIView pour remplacer le InputAccessoryView et le faire renvoyer la valeur de l'enfant UITextView et ceci fixé.

Je soupçonne que Monotouch a un problème pour acheminer l'événement vers le mauvais objet et que mon correctif l'a résolu.

code pseudo:

public class ParentView : UIView 
{ 
    UILabel Label; 
    MyTextView Text; 

/*Magic line here that fixed the problem */ 
public override UIView InputAccessoryView {get{return Text.InputAccessoryView;}} 
} 

public class MyTextView : UITextView 
{ 
    UIView Accessory; 

    public override UIView InputAccessoryView {get{return Accessory;}} 
}