removeFromSuperview вызывает сбой моего приложения - PullRequest
5 голосов
/ 09 июля 2011

Я уверен, что это какая-то глупая ошибка, но в течение последнего часа я пытаюсь удалить подпредставление из моего суперпредставления без какого-либо успеха.

На мой первый взгляд у меня

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

А затем внутри helpView у меня есть кнопка, которая подключена к IBAction под названием «closeHelp», который просто делает следующее:

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

Но это приводит к сбою моего приложения с EXC_BAS_ACCESS по какой-то странной причине, даже если это внутри HelpView, то есть self.view должно указывать на правильное представление.

Буду признателен за вашу помощь

Спасибо.
Шай.

Ответы [ 5 ]

5 голосов
/ 09 июля 2011

Как ответил Андреас, вы пытаетесь удалить self.view из представления super / parent.В основном вам нужно удалить helpView из родительского представления.

, поэтому оно должно быть

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

Но мы не знаем, что такое "helpView" в вышеприведенном методе.Поскольку у нас нет никакого дескриптора для этого.

Так что наш код должен наконец выглядеть следующим образом.

#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];
}
2 голосов
/ 09 июля 2011

self.view указывает не на ваше подпредставление, а на корневое представление, которым управляет ваш uiviewcontroller. Вероятно, вам следует удалить только последний объект в стеке подпредставления, а не весь вид, потому что теперь вы удаляете весь вид справки.

В любом случае, почему вы не представляете viewcontroller модально вместо этого?

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

helpView. modalTransitionStyle = //One of the constants below

UIModalTransitionStyleCoverVertical
UIModalTransitionStyleFlipHorizontal
UIModalTransitionStyleCrossDissolve
UIModalTransitionStylePartialCurl

Обычно я пишу self.modalTransitionStyle = // One of the constants в контроллере представления, который будет представлен модально, вместо распространения кода.

1 голос
/ 09 июля 2011

Вы инициализируете helpView как UIViewController.
Убедитесь, что у вас есть #import "HelpView.h" (или как там называется файл helpView .h) в файле .h контроллера представления, где вы инициализируетеэто.

Затем используйте этот код:

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

Это должно исправить.

0 голосов
/ 10 июля 2011

Самое простое решение для меня в конечном итоге состояло в том, чтобы просто определить владельца файла моей XIB в том же классе, что и родительский контроллер, то есть родительский контроллер будет управлять как родителем, так и подпредставлением, что значительно упрощает задачу. :)

0 голосов
/ 09 июля 2011
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];}

...