Создайте UIView через код и добавьте события в iphone - PullRequest
1 голос
/ 11 января 2010

Я создал UIView и добавил к нему метку, а затем назначил ее контроллеру. Теперь, когда я нажимаю на мой вид, он показывает мне «EXC_BAD_ACCESS».

Ниже мой код.

//create a UIView in App Delegate  
UIView *viewPtr = [[[UIView alloc] initWithFrame:frmRect] autorelease];  

//created a Button and added to UIView  
UIButton *btnPointer = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
btnPointer.frame = cgframe; // provides both a position and a size  
[btnPointer setTitle:btnLabelText forState:UIControlStateNormal];  
[btnPointer addTarget:self action:@selector(generate:) forControlEvents:UIControlEventTouchUpInside];
[viewPtr addSubview:btnPointer];  

//Now need to add this UIView to a controller  
viewController.view = viewPtr;  

Я могу отобразить кнопку в форме, но когда я нажимаю на форму или кнопку, я получаю «EXC_BAD_ACCESS».

Ответы [ 4 ]

1 голос
/ 11 января 2010

Вместо использования автоматического выпуска

UIView *viewPtr = [[[UIView alloc] initWithFrame:frmRect] autorelease];

Создайте UIView * viewPtr для файла .h и делайте выпуск только в методе dealloc

Итак, у вас будет декларация в вашем .h файле


UIView *viewPtr;

И ваш файл .m будет со следующими строками, когда вы создаете экземпляр viewPtr в том же месте, где вы делали ранее, но без автоматического выпуска и выпуска по методу dealloc, как показано ниже:


viewPtr = [[UIView alloc] initWithFrame:frmRect];
.
.
.
.
.
.
.
.

- (void)dealloc {
    [viewPtr release];
    [super dealloc];
}

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

Приветствия,
VFN

1 голос
/ 11 января 2010

Вы должны создать представление в файле .m вашего контроллера представления следующим образом.

    - (void)loadView
    {
        UIView *viewPtr = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

    //created a Button and added to UIView  
    UIButton *btnPointer = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
    btnPointer.frame = cgframe; // provides both a position and a size  
    [btnPointer setTitle:btnLabelText forState:UIControlStateNormal];  
    [btnPointer addTarget:self action:@selector(generate:) forControlEvents:UIControlEventTouchUpInside];
    [viewPtr addSubview:btnPointer];  

    //Now need to add this UIView to a controller  
    self.view = viewPtr;
[viewPtr release];
    }

Надеюсь, это поможет.

Спасибо

Madhup

0 голосов
/ 12 января 2010

Как говорит vfn , это ошибка, потому что вы слишком рано освобождаете представление. Вопрос, который я хотел бы задать, - почему этот случай отличается?

Обычно в задании, подобном этому:

viewController.view = viewPtr;

viewPtr сохраняется, и вы были бы правы выпустить его самостоятельно. Но посмотрите на определение :

@property(nonatomic, retain) UIView *view

Это означает, что любое значение просто присваивается и не сохраняется автоматически.

0 голосов
/ 11 января 2010

Что такое self в [btnPointer addTarget:self ...? generate: называется? Вы пробовали там отладку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...