2013-09-24 7 views
1

Ok, donc c'est assez bizarre; avant de passer à la version finale de GMseed de Xcode mes boutons fonctionnaient parfaitement bien ... Maintenant, je ne peux même pas les faire sur une échelle super simple sans que le programme plante sur click.UIButton se bloque sur Cliquez

L'aspect le plus bizarre absolu est que cela fonctionne QUELQUES de temps, mais comme 85%, il se bloque juste; et quand cela fonctionne, il va s'écraser après une utilisation intensive.

Voici mon code (dépouillé à la mise en œuvre du bouton plus simple que je pouvais penser):

@interface TESTViewController() 
{ 
    UIButton *button; 
} 

@end 

@implementation TESTViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) 
    { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    [self addButton]; 
    [button addTarget:self action:@selector(buttonPressed) 
    forControlEvents:UIControlEventTouchDown]; 
} 

- (void)addButton 
{ 
    button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, 45)]; 

    [button setTitle:@"CLICK" forState:UIControlStateNormal]; 

    [button setBackgroundColor:[UIColor blackColor]]; 

    [self.view addSubview:button]; 
} 

- (void)buttonPressed 
{ 
    NSLog(@"WORKED"); 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 


    TESTViewController *test = [[TESTViewController alloc] init]; 

    [self.window addSubview:test.view]; 

    return YES; 
} 

J'ai essayé de créer le bouton dans la fonction init, viewDidLoad - ne fonctionne toujours, bien que viewDidLoad semble fonctionner un peu plus souvent ...

J'ai essayé -(void) addButton:(UIButton*)button ainsi en utilisant:

[button addTarget:self action:@selector(buttonPressed:) 
     forControlEvents:UIControlEventTouchDown]; 

- Pas de différence.

Je suis à perte totale. J'ai essayé de le chercher ici sur les forums, mais malheureusement, la plupart d'entre eux se réfèrent à la programmation avec IBActions.

L'erreur que j'obtiens est un mauvais accès Donc, je suppose que lorsque le bouton est cliqué, il n'accède pas réellement à la fonction buttonPressed mais quelque chose d'autre entièrement ... Je n'ai aucune idée de pourquoi ce serait le cas. ..

Merci pour toute aide!

+2

pourquoi n'utilisez-vous pas 'UIControlEventTouchUpInside'? –

+0

Je ne pense pas que le problème avec UIControlevent ce problème pour relase Button Object juste donner la propriété 'UIBUtton' et' Systhsize' et utiliser Self.button –

+0

collez l'erreur comme il est montré dans la console. –

Répondre

1

Je pense que vous avez une fuite de mémoire sur cet objet Bouton utilisez-vous ARC ou la gestion manuelle de la mémoire? Si manuel, assurez-vous de le conserver. Si elle est ARC utiliser une propriété et le compilateur fera le reste du travail

@property (nonatomic, strong) UIButton *button; 
0

essayer cette façon

- (void)addButton 
{ 
    button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, 45)]; 
    [button addTarget:self action:@selector(buttonPressed) 
       forControlEvents:UIControlEventTouchDown]; 
    [button setTitle:@"CLICK" forState:UIControlStateNormal]; 

    [button setBackgroundColor:[UIColor blackColor]]; 

    [self.view addSubview:button]; 
} 

et enlever

[button addTarget:self action:@selector(buttonPressed) 
forControlEvents:UIControlEventTouchDown]; 

cette ligne de viewDidLoad

-1

Pour définir un bouton, utilisez la méthode buttonWithType par programmation, Essayez ceci

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button addTarget:self 
      action:@selector(buttonPressed) 
forControlEvents: UIControlEventTouchUpInside];//Any control event type 
[button setTitle:@"Show View" forState:UIControlStateNormal]; 
button.frame = CGRectMake(0, 0, 80, 45); 
[view addSubview:button]; 
+0

Downvote? Pourquoi? S'il vous plaît donner des commentaires tout en downvoting –

0

Je ne sais pas si cela est la cause de l'accident, mais les actions (comme votre buttonPressed) devrait avoir un paramètre de l'expéditeur: Méthode

[button addTarget:self action:@selector(buttonPressed:) 

- (void)buttonPressed:(id)sender 
{ 
... 
} 
3

Le problème est dans votre « de didFinishLaunchingWithOptions ». Ici, vous créez un objet local qui devient Deallocated par exemple "TESTViewController * test = [[TESTViewController alloc] init]". Vous devez conserver cet objet, essayez donc d'en faire une propriété et utilisez "self.test = [[TESTViewController alloc] init]". Ça va marcher. De manière classique, vous devez utiliser rootViewController plutôt que d'ajouter votre viewController à la sous-vue de Windows.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.test = [[TESTViewController alloc] initWithNibName:nil bundle:nil]; 
    self.window.rootViewController = self.test; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

Oh mon Dieu, merci !! –

+0

De plus, pour savoir quelle instance est désaffectée, vous pouvez utiliser "Activer les objets Zombie" dans l'onglet "Diagnostics" de "Modifier les schémas". Ce [lien] (http://stackoverflow.com/questions/5386160/how-to-enable-nszombie-in-xcode) pourrait aider. – RoHaN