2011-07-09 17 views
5

Jestem pewien, że to jakiś głupi błąd, ale staram się przez ostatnią godzinę usunąć podgląd z mojego superwizji bez powodzenia.removeFromSuperview powoduje awarię mojej aplikacji

Na moim pierwszym widoku Mam

UIViewController *helpView = [[[UIViewController alloc] initWithNibName:@"HelpView" bundle:nil] autorelease]; 
[self.view addSubview:helpView.view]; 

A potem wewnątrz helpView mam przycisk, który jest podłączony do IBAction nazwie „closeHelp”, który właśnie wykonuje następujące operacje:

- (IBAction) closeHelp{ 
    [self.view removeFromSuperview]; 
} 

Ale to powoduje awarię mojej aplikacji z EXC_BAS_ACCESS z jakiegoś dziwnego powodu, nawet jeśli jest to wewnątrz HelpView, co oznacza, że ​​self.view powinien być wskazany we właściwym wyglądzie ..

Wo Dziękujemy za pomoc

Dziękuję.
Shai.

+0

W jakiej klasie masz "-closeHelp"? Czy jest poprawnie okablowany w narzędziu do tworzenia interfejsów? Czy ustawiłeś klasę w pliku HelpView.xib na klasę? – Eiko

Odpowiedz

5

Jak odpowiedział Andreas, próbujesz usunąć self.view z widoku super/rodzica. Po prostu trzeba usunąć helpView z jego widoku nadrzędnego.

tak powinno być

- (IBAction) closeHelp{ 
    [helpView removeFromSuperview]; 
} 

Ale nie wiemy, co jest „helpView” w powyższej metodzie. Ponieważ nie mamy na to żadnego wpływu.

Nasz kod powinien wreszcie wyglądać tak.

#define HELP_VIEW_TAG 101 // Give tag of your choice 

HelpView *helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil]; 
helpView.view.tag = HELP_VIEW_TAG; 
[self.view addSubview:helpView.view]; 
[helpView release]; 

- (IBAction) closeHelp{ 
    UIView *helpView = [self.view viewWithTag:HELP_VIEW_TAG]; 
    [helpView removeFromSuperview]; 
} 
+0

Hej, dzięki! próbowałem zrobić to rozwiązanie, ale teraz subview nawet nie załaduje ... (EXC_BAD_ACCESS) UIViewController * helpView = [[[UIViewController alloc] initWithNibName: @ "HelpView" bundle: nil] autorelease]; helpView.view.tag = HELP_VIEW_TAG; [self.view addSubview: helpView.view]; [helpView release]; –

+0

Ok teraz pokazuje (zrobił coś głupiego z wydań), ale przycisk zamykania nadal nie działa ... UIView * helpView = [self.view viewWithTag: 101]; [helpView removeFromSuperview]; (czy numer znaczka zakodowany na wszelki wypadek na przykład) –

+0

Mam nadzieję, że widok pomocy zostanie dodany jako wyskakujący i zostanie wyświetlony. Wyobrażam sobie, że masz zamknięty przycisk w widoku pomocy i jest on powiązany z metodą działania w powyższym kodzie, który powinien sam siebie odrzucić, czy to prawda? –

2

Self.view nie wskazuje na twój podgląd, ale widok główny, którym zarządza twój kontroler uiviewcontroller. Powinieneś prawdopodobnie usunąć tylko ostatni obiekt ze stosu podrzędnego, a nie cały widok, ponieważ teraz usuwasz cały widok pomocy.

W każdym razie, dlaczego nie udostępniasz viewcontroller zamiast tego?

[self presentModalViewController:helpView animated:NO/YES]; 

helpView. modalTransitionStyle = //One of the constants below 

UIModalTransitionStyleCoverVertical 
UIModalTransitionStyleFlipHorizontal 
UIModalTransitionStyleCrossDissolve 
UIModalTransitionStylePartialCurl 

Zazwyczaj piszę self.modalTransitionStyle = // One of the constants w viewcontroller który zostanie przedstawiony modally, zamiast szerzenia kod.

+0

Ta metoda należy jednak do HelpViewController, a ostatnie zdanie nie ma tutaj znaczenia. Jeśli chcesz zmodyfikować hierarchię widoków, Twój widok musi zostać załadowany, a self.view jest odpowiednim sposobem odniesienia do widoku. – Eiko

1

Inicjujesz helpView jako UIViewController.
Upewnij się, że masz #import "HelpView.h" (lub jakkolwiek jest wywoływany plik helpView .h) w pliku .h kontrolera widoku, w którym go zainicjujesz.

Następnie użyj tego kodu:

HelpView *helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil]; 
[self.view addSubview:helpView.view]; 

To powinno go naprawić.

+0

Zasadniczo, w kodzie, próbuje usunąć self.view z jego podglądu, który prawdopodobnie powinien być zerowy. –

+0

To prawdopodobnie odpowiednia odpowiedź. – Abizern

-1
Declare the help view on calss level. 

in.h file 

@class HelpView; 
.. 
@interface 
{ 
HelpView *helpView; 
} 
@property(nonatomic,retain)HelpView* helpView; 


In.m file 
#import "HelpView" 
@synthensize helpView; 



now add this Code where you want 

helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil]; 
helpView.view.tag = HELP_VIEW_TAG; 
[self.view addSubview:helpView.view]; 


- (IBAction) closeHelp{ 
    //UIView *helpView = [self.view viewWithTag:HELP_VIEW_TAG]; 
    [helpView removeFromSuperview]; 
} 

- (void) dealloc { [helpView release]; }

+0

w podrzędnej dealloc lub helpallocalloc? Zgaduję, że rodzic? –

+0

w .m tego pliku dodaj - (void) dealloc {[helpView release]} – dark

+0

Nie ma sensu dodawanie delegatów do kontrolerów widoku. To dezorientuje początkujących; – Greg

0

Najprostszym rozwiązaniem dla mnie było po prostu zdefiniowanie właściciela pliku XIB jako tej samej klasy co kontroler nadrzędny, co oznacza, że ​​kontroler nadrzędny kontrolowałby zarówno nadrzędnego, jak i podrzędnego, co po prostu znacznie ułatwia.:)