2009-09-03 9 views
5

Le UITabBarController n'autorise pas l'orientation paysage. J'ai donc utilisé une sous-classe de UITabBarContoller (appelée RotatingTabBarController). Son seul but est d'autoriser la rotation en renvoyant YES à l'appel shouldAutorotateToInterfaceOrientation.Orientation paysage pour UITabBarController?

Le problème est que lorsque vous faites pivoter l'iPhone dans le simulateur, il donne l'erreur malloc suivante. J'utilise 3.0 SDK avec Xcode 3.2 sur Snow Leopard. J'ai défini un point d'arrêt dans malloc_error_break mais je ne peux pas le retrouver dans mon code. Y at-il quelque chose que je peux faire pour que cette erreur disparaisse?

Voici la classe RotatingTabBarController:

#import <UIKit/UIKit.h> 
@interface RotatingTabBarController : UITabBarController { 
} 
@end 

@implementation RotatingTabBarController 
-(BOOL)shouldAutorotateToInterfaceOrientation:UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 
@end 

Mise à jour:

J'ai essayé la même chose avec une catégorie. Mais cela donne la même erreur de malloc.

// UITabBarController+Rotation.h 
@interface UITabBarController (rotation) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; 
@end 

// UITabBarController+Rotation.m 
#import "UITabBarController+Rotation.h" 

@implementation UITabBarController (rotation) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 
@end 

Backtrace

[Session started at 2009-09-05 12:13:19 -0400.] 
Untitled(992,0xa06d9500) malloc: *** error for object 0x2024000: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Untitled(992,0xa06d9500) malloc: *** error for object 0x2014000: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

[Session started at 2009-09-05 12:13:27 -0400.] 
GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul 3 01:19:56 UTC 2009) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "x86_64-apple-darwin".Attaching to process 992. 
sharedlibrary apply-load-rules all 
(gdb) bt 
#0 0x951908fa in mach_msg_trap() 
#1 0x95191067 in mach_msg() 
#2 0x30244d62 in CFRunLoopRunSpecific() 
#3 0x30244628 in CFRunLoopRunInMode() 
#4 0x32044c31 in GSEventRunModal() 
#5 0x32044cf6 in GSEventRun() 
#6 0x309021ee in UIApplicationMain() 
#7 0x00002608 in main (argc=1, argv=0xbfffef94) at /Users/vishwas/Desktop/Untitled/main.m:13 
(gdb) 
+1

Nous avons pu le faire pivoter en utilisant une catégoty sur UITabBarController au lieu d'une sous-classe, et cela fonctionne pour nous. Je ne suis pas sûr de savoir quoi faire de votre erreur, j'ai peur que je n'ai pas couru dans cette circonstance :( – Kevlar

+0

Pouvez-vous s'il vous plaît expliquer comment faire la mise en œuvre de la catégorie – Vic

+0

J'ai essayé l'approche de Kevlar comme ça, mais je suis toujours obtenir le même pointeur malloc erreur libéré :( // UITabBarController + Rotation.h @interface UITabBarController (rotation) - (BOOL) shouldAutorotateToInterfaceOrientation:. (UIInterfaceOrientation) interfaceOrientation; @end // UITabBarController + Rotation.m #import "UITabBarController + Rotation.h" @implementation UITabBarController (rotation) - (BOOL) shouldAutorotateToInterf aceOrientation: (UIInterfaceOrientation) interfaceOrientation { return YES; } @end – Vic

Répondre

8

Ceci est un bug dans iPhone SDK 3.0. Il est résolu dans l'iPhone SDK 3.1

0

Cette erreur ressemble à quelque chose est soit libéré sans alloc/init, ou il est en cours à double libéré, ne ressemble pas à une erreur dans votre sous-classage ou code.

J'aime l'approche de catégorie de Kevlar pour résoudre votre problème, c'est créatif, simple, et devrait fonctionner pour vous.

+0

J'ai demandé à Kevlar d'expliquer comment faire la mise en œuvre de la catégorie. – Vic

+0

Si vous avez essayé l'approche par catégorie et que cela ne fonctionne pas, c'est juste une preuve de plus que le problème n'est pas votre classe enfant, c'est ailleurs. Vérifiez vos cycles alloc/init/release et assurez-vous de ne pas relâcher deux fois – slf

+0

Il s'agit d'un projet simple. Dans Xcode, j'ai créé un nouveau projet de test en tant que "Application de barre d'onglets". Ajout des deux fichiers UIBarTabBarController + Rotation.h & .m au projet, et ajout de la ligne #import "UITabBarController + Rotation.h" à TestAppDelegate.h. Voilà, il n'y a pas d'autre code dans le projet mais il donne quand même cette erreur. – Vic

8

Sous-classe UITabBarController n'est pas recommandé pour la rotation de l'interface. En fait, la documentation d'Apple dit strictement de ne pas sous-classer UITabBarController ou UINavigationController. Il indique également que pour que UITabBarController prenne en charge l'autorotation, tous les contrôleurs "gérés" par celui-ci doivent prendre en charge cette orientation (c'est-à-dire le paysage dans ce cas).

+1

Merci pour la réponse. Je courais en rond jusqu'à ce que je le lis. L'un de mes points de vue n'était pas encore complet et, bien sûr, n'a pas retourné "OUI". – R4cOON

+0

liée: la rotation fonctionnait pour moi (en utilisant la méthode approuvée par Apple pour que tous les contrôleurs 'gérés' retournent OUI), mais mes vues n'étaient pas automatiquement redimensionnées en rotation, bien que toutes les propriétés de redimensionnement soient correctement définies dans le constructeur d'interface. Cette pépite m'a aidé: http://www.codebunnygames.com/?p=18 – mattorb

Questions connexes