2011-07-29 2 views
3

Возможно ли реализовать initWithNubName для пользовательского класса, который расширяет UIView.iOS initWithNibName для 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]; 

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

Se также, как я установил XIB:

enter image description here

Я бы сделать

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

, но это не так верно?

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

+0

I Я не уверен, что понимаю, что вы пытаетесь достичь. – onnoweb

+0

Я просто хочу добавить метод initWithNibName в мой класс, который расширяет UIView (не UIViewController). – xpepermint

+0

Я так не думаю. Метод «initWithNibName» определен в классе UIViewController в SDK, а не в UIView, поэтому вы не можете переопределить этот метод в своем классе, который расширяет UIView. – indiantroy

ответ

3

Чтобы обойти вопрос о назначении себя и потерять основную ссылку на класс, интересно, если вы должны сделать это так же, как при загрузке UITableViewCell из СИБ:

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

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

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

+0

гул ... но как я могу установить первый вид (из массива loadNibNamed) в качестве владельца? – xpepermint

+0

У вас будет этот код в методе, в котором вы создаете экземпляр UIPullerView. Таким образом, этот класс будет владельцем. – onnoweb

+0

ну да ... Я знаю, было бы очень легко использовать UIViewController, но UIView с nib-файлом в качестве одного класса сложнее ... – xpepermint

1

Создать ExampleView.xib

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

@interface ExampleView : UIView 

@end 

В Инспекторе идентификации ExampleView.xib, установите Пользовательский класс на 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

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

- (instancetype)initWithNib { 
    NSString *nibName = [NSString stringWithUTF8String:object_getClassName(self)]; 
    return [[[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]; 
} 
Смежные вопросы