2014-12-05 5 views
5

Я создал собственный подкласс UIView вместе с xib-файлом и объявил IBOutlets и IBActions в пределах настраиваемого класса.Пользовательский UIView загружен из Xib

@interface ContactUsView : UIView 

@property (nonatomic, weak) IBOutlet UIButton *displayCloseButton; 

- (IBAction)callButtonPressed:(id)sender; 
- (IBAction)emailButtonPressed:(id)sender; 
- (IBAction)displayCloseButtonPressed:(id)sender; 

@end 

В файле xib я перетащил в UIView, чтобы представить свое пользовательское представление. Я поставил:

  • Файлы Владелец = моему пользовательского класса
  • Установили перетаскиваемых в UIView на мой пользовательский класс.

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

Внутри ContactUsView.m я следующее:

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
     NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"ContactUsView" owner:self options:nil]; 
     for (id object in array) { 
      if ([object isKindOfClass:[ContactUsView class]]) 
       self = (ContactUsView *)object; 
     } 
    } 
    return self; 
} 

Когда я пришел, чтобы создать эту точку зрения я делаю следующее:

- (void)viewWillAppear:(BOOL)animated 
{ 
    ContactUsView *contactUs = [[ContactUsView alloc] initWithFrame:CGRectZero]; 

    CGPoint origin = self.view.frame.origin; 
    CGSize size = self.view.frame.size; 
    [contactUs setFrame:CGRectMake(origin.x, 
           CGRectGetMaxY(self.view.frame) - 100, 
           size.width, 
           contactUs.frame.size.height)]; 

    [self.view addSubview:contactUs]; 
} 

Выпуск Когда я нажимаю на одном из кнопки, с которыми работает приложение: Тема 1: EXC_BAD_ACCESS (код = 2, адрес = 0xb0c

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

Если вам нужна дополнительная информация, то дайте мне знать. Большое спасибо.

Дальнейшая ссылка При создании пользовательского представления с использованием xib НЕ устанавливайте владельца файлов. Вместо этого создайте все свои IBOutlets и IBActions, как обычно, а затем подключите их, откройте вкладку «Утилиты» и перетащите элемент управления.

enter image description here

+0

Вы можете разместить весь ошибка? Или строка, где происходит ошибка? Включить контрольные точки для исключений в XCode. – KerrM

+0

Если я поставил точку прерывания в один из методов, который вызывается, он никогда не попадает в точку останова. Он просто падает с кодом выше, и на выходе ничего не отображается. Я добавил точку останова «Все исключения» и все еще ничего не отображается на выходе. – pls

ответ

4

• владелец файлов = на мой пользовательский класс

Неправильно. Владелец файлов должен быть пустым. Само представление является владельцем файлов. Это означает, что вы должны соединить все действия и выходы с ContactUsView в вашем xib.

[[NSBundle mainBundle] loadNibNamed: @ "ContactUsView" владелец: варианты самостоятельно: ноль]

...

сами = (ContactUsView *) объект;

После того, как вы прошли self как owner параметр. Вы меняете его. Это означает, что ранее выделенные ContactUsView (self) будут уничтожены с -loadNibNamed:owner:options: не сохраняют его.Если применить мой первый совет, который Вы должны отправить nil в качестве owner параметра

for петли здесь не нужно использовать только array[0], потому что это всегда ваше мнение, если у вас есть действительные иерархии просмотров в вашем XIb

+0

Большое спасибо Silmaril. Это определило мою проблему. Для дальнейшего использования при создании пользовательского представления вам нужно открыть тег Utilities и перетащить управление оттуда. – pls

0

Вы можете использовать делегат для этого этого, как вы можете сделать это

 @protocol CustomViewDelegate <NSObject> 
- (void)callButtonPressed:(id)sender; 
- (void)emailButtonPressed:(id)sender; 
- (void)displayCloseButtonPressed:(id)sender; 

@end 

@interface ContactUsView : UIView 

@property (nonatomic, weak) IBOutlet UIButton *displayCloseButton; 

@property (nonatomic, weak) id<CustomViewDelegate> ButtonDelegate; 

- (IBAction)callButtonPressed:(id)sender; 

- (IBAction)emailButtonPressed:(id)sender; 
- (IBAction)displayCloseButtonPressed:(id)sender; 


@end 

и в.м-файл

- (IBAction)callButtonPressed:(id)sender 
{ 
[self.ButtonDelegate callButtonPressed:sender]; 
} 

- (IBAction)emailButtonPressed:(id)sender{ 
[self.ButtonDelegate emailButtonPressed:sender]; 
} 

- (IBAction)displayCloseButtonPressed:(id)sender{ 
[self.ButtonDelegate displayCloseButtonPressed:sender]; 
} 

После этого просто установите делегат с ViewController refrence и использовать эти делегат здесь

- (void)viewWillAppear:(BOOL)animated 

{

ContactUsView *contactUs = [[ContactUsView alloc] initWithFrame:CGRectZero]; 
contactUs.ButtonDelegate = self; 

CGPoint origin = self.view.frame.origin; 
CGSize size = self.view.frame.size; 
[contactUs setFrame:CGRectMake(origin.x, 
          CGRectGetMaxY(self.view.frame) - 100, 
          size.width, 
          contactUs.frame.size.height)]; 

[self.view addSubview:contactUs]; 

}

- (void)callButtonPressed:(id)sender 

{}

- (void)emailButtonPressed:(id)sender 

{}

- (void)displayCloseButtonPressed:(id)sender 

{}

Я сделал это и работает totlly отлично

+0

Спасибо за ответ. Вы загружаете xib так же, как я? Мое приложение падает, когда я нажимаю кнопку, привязанную к IBAction. Однако он немедленно сработает, и в этом методе ничего не происходит. Если мне кажется, что что-то связано с памятью при загрузке представления. – pls

+0

Да, я делаю то же самое. –

2

Если вы загружаете UIView в течение XIb, то вы должны создать метод класса для загрузите представление.

В вашем customview.h

+(id)customView; 

& в вашем customview.m

+ (id)customView 
{ 
    CustomView *customView = [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:nil options:nil] lastObject]; 
    if ([customView isKindOfClass:[CustomView class]]) 
     return customView; 
    else 
     return nil; 
} 

Вы можете инициализировать его в любом месте с помощью:

CustomView *myView = [CustomView customView]; 

EDIT: Убедитесь, что вы изменили класс customview в личность инспектор & также убедитесь, что ваше соединение IBActions с методами этого класса. enter image description here

enter image description here

+0

Привет, Аджай. Да, я, скорее всего, реализую это как метод класса. Однако код в вашем методе совпадает с моим кодом и по-прежнему вызывает такой же крах. – pls

+0

Проверь мой обновленный ответ – Ajay

+0

Ответ Сильмарила заставил меня понять, что я делаю неправильно. Я уже принял его ответ, прежде чем видеть отредактированный ответ, который имеет такое же решение. Я тоже проголосовал за ваш ответ. Большое спасибо. – pls

Смежные вопросы