2014-01-21 3 views
0

Я сделал свой собственный класс с UIView, включая UIButton и способ для него:UIButton из моего класса не работает (EXC_BAD_ACCESS) в ViewController

MyClass.h 

@property (strong, nonatomic) UIView* mainBack; 
@property (strong, nonatomic) UIButton* sortButton; 


MyClass.m 

- (id) initFor: (int) object { 

if (self = [super init]) { 

    _mainBack = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; 

    _sortButton = [UIButton buttonWithType:UIButtonTypeSystem]; 
    _sortButton.frame = CGRectMake(10.0, 5.0, 60.0, 40.0); 
    [_sortButton addTarget:self action:@selector(ChangeSort) forControlEvents:UIControlEventTouchUpInside]; 
    [_mainBack addSubview:_sortButton]; 
    } 
return self; 
} 

- (void) ChangeSort { 
NSLog(@"change"); 
} 

- (void) ShowBarOnView: (UIViewController*) view AtPoint: (CGPoint) point{ 
[_mainBack setFrame:CGRectMake(point.x, point.y, _mainBack.frame.size.width, _mainBack.frame.size.height)]; 
[view.view addSubview:_mainBack]; 
} 

В ViewController я сделал экземпляр MyClass и называется метод показать Просмотреть

MyClass* mySort = [[myClass alloc] initFor: rooms]; 
[mySort ShowBarOnView:self AtPoint:CGPointMake(0, 50)]; 

Таким образом, я получил вид с помощью кнопки, но при нажатии, происходит сбой приложения и показывает: EXC_BAD_ACCESS (код = 1, адрес = 0x0)

Что не так?

Спасибо.

+0

отладчик мог бы сказать вам, что. BTW, если вы не используете ARC, тогда строка '_sortButton = [UIButton buttonWithType: UIButtonTypeSystem];' отсутствует 'keep'. –

+1

Пожалуйста, измените название своего класса для лучшей практики, имена классов должны быть буквами 'MyClass.m' вместо' myClass.m' – Malloc

+0

Возможно, не связанный, но вы должны использовать 'self.' для доступа к своим переменным экземпляра везде вне методов setter, getter, init и alloc. – nhgrif

ответ

0

Я решил эту проблему, добавив в в ViewController.h

@property (strong, nonatomic) MyClass* mySort; 

и изменить свой код в ViewController.m к

_mySort = [[SortAndSeach alloc] initFor:for_what]; 
[_mySort ShowBarOnView:self AtPoint:CGPointMake(0, 50)]; 

Спасибо всем!

+0

Если ваш вопрос был дан ответ, даже самому себе, вы должны, вероятно, пометить его, решив «принять этот [ваш] ответ». Таким образом, это должно помочь другим, у кого может быть эта проблема! ура –

0

Если опубликованный фрагмент кода отображается точно так же, как указано, проблема в том, что следующие строки НИКОГДА не выполняются. Вероятно, Xcode предупреждает вас о них:

_mainBack = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; 

_sortButton = [UIButton buttonWithType:UIButtonTypeSystem]; 
_sortButton.frame = CGRectMake(10.0, 5.0, 60.0, 40.0); 
[_sortButton addTarget:self action:@selector(ChangeSort) 
    forControlEvents:UIControlEventTouchUpInside]; 
[_mainBack addSubview:_sortButton]; 

Как указано, эти линии существуют полностью вне любого метода. Что бы больше смысла, чтобы создать фабричный метод:

+ (instancetype) mainViewAtPoint:(CGPoint)point inContext: 
    (UIViewController*)viewController { 

    self.mainBack = [[UIView alloc] initWithFrame:CGRectMake(point.x,point.y, 
     320,50)]; 

    self.sortButton = [UIButton buttonWithType:UIButtonTypeSystem]; 
    self.sortButton.frame = (CGRectMake(10.0, 5.0, 60.0, 40.0); 
    [self.sortButton addTarget:self action:@selector(ChangeSort) 
     forControlEvents:UIControlEventTouchUpInside]; 
    [self.mainBack addSubview:self.sortButton]; 

    [viewController.view addSubview: self.mainBack]; 
} 

Теперь все, что вам нужно сделать, чтобы Alloc, первонач, создать и добавить эту точку зрения на ваш контроллер представления просто так:

[myClass mainViewAtPoint:aPoint inContext:aViewController]; 

Очевидная подсказка, что ваша кнопка фактически не создана, отключена EXC_BAD_ACCESS. Это говорит вам, что он пытается ссылаться на ячейку памяти 0x0. Каждый раз, когда что-либо пытается получить доступ к адресу памяти 0x0, вы пытаетесь вызвать метод на объекте, у которого нет адреса памяти ... он никогда не был назначен.

+0

Извините, я ввел вас в заблуждение. Я получил исходный метод, это те строки. Я исправил код в своем вопросе – user2976219

1

Да, у меня была такая же проблема!

У меня был MainViewController, создав PlayingViewController в способе и коротком коротком рассказе, что было проблемой.

SOFMainVC.h 
SOFMainVC.m 
#import "SOFPlayingVC.h" ... 

- (void)someMethodBeingCalled { 
    SOFPlayingVC *playingVC = [[SOFPlayingVC alloc] init]; 
    [self.view addSubview:playingVC.view]; 
} 

SOFPlayingVC.m 
... 
... 
- (void)viewDidLoad { 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setFrame:CGRectMake(0, 0, 100, 50)]; 
    [button addTarget:self 
     action:@selector(buttonAction:) 
     forControlEvents:UIControlEventTouchUpInside]; 
     [self.view addSubView:button]; 
... 
... 
} 

И если бы мы Сосредоточьтесь на SOFPlayingVC в документах, мы увидим, что контроллер будет мусор, как только это будет сделано быть экземпляром. Однако, если мы просто добавим его в контроллер, который используется в качестве @property (nonatomic, strong), мы не потеряем его, пока его из SOFMainViewController.

Так что решение нашей проблемы здесь были:

#import "SOFPlayingVC.h" 
SOFMainVC.h 
... 
@interface SOFMainVC : UIViewController 
@property (nonatomic, strong) SOFPlayingVC *playingVC; 
... 
@end 

SOFMainVC.m 
#import "SOFPlayingVC.h" ... ... 

- (void)someMethodBeingCalled { 
SOFPlayingVC *playingViewController = [[SOFPlayingVC alloc] init]; 
[self.view addSubview:playingVC.view]; 
} 
Смежные вопросы