iOS initWithNibName для UIView - PullRequest
       0

iOS initWithNibName для UIView

3 голосов
/ 29 июля 2011

Возможно ли реализовать initWithNubName для пользовательского класса, расширяющего UIView.

Пример:

.h

@interface UIPullerView : UIView
{
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    NSBundle *bundle = nibBundleOrNil==nil ? [NSBundle mainBundle] : nibBundleOrNil;
    NSString *nibName = nibNameOrNil==nil ? @"UIPullerView" : nibNameOrNil;
    if (self == [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]) 
    {
        NSLog(@"yes, the same class");
    }
    return self;
}

некоторые классы контроллеров вызывают это

UIPullerView *puller = [[UIPullerView alloc] initWithNibName:nil bundle:nil];

Это не рабочий пример, потому что я не устанавливаю для первого объекта XIB значение self.Если бы я был, я бы потерял ссылку на основной класс, верно?Поэтому я хотел бы добавить метод, который будет читать файл XIB и копировать объект из XIB в себя.Я не хочу использовать UIViewController, но UIView, поэтому никакие дополнительные представления не должны быть добавлены к основному виду.

Также, как я устанавливаю XIB:

enter image description here

Я бы сделал

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
...
    self = [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]
    return self;
}

, но это не правда?

Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Чтобы обойти проблему присвоения себя и потери ссылки на основной класс, мне интересно, следует ли вам делать это так же, как при загрузке UITableViewCell из NIB:

  [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil];
  cell = myTableCell;
  self.myTableCell = nil;

и установке классакоторый делает это как владелец NIB.

Конечно, если вы создаете экземпляр своего UIPullerView в нескольких разных местах, то последняя часть становится сложной ...

1 голос
/ 30 июля 2014

Создать ExampleView.xib

Создать ExampleView.h и ExampleView.m

 @interface ExampleView : UIView

 @end

В ExampleView.xib Identity Inspector установите Custom Class на ExampleView

enter image description here

В Example.m, добавить awakeFromNib

- (void)awakeFromNib
{
    [super awakeFromNib];
 // [self whateverInits];
}

, который будет выполняться всякий раз, когда представление загружается, скажем, с помощью:

NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"ExampleView" owner:self options:nil];
ExampleView *exampleView = [objects firstObject];
0 голосов
/ 17 апреля 2017

Попробуйте это:

- (instancetype)initWithNib {
    NSString *nibName = [NSString stringWithUTF8String:object_getClassName(self)];
    return [[[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil] objectAtIndex:0];
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...