Создание ASP.Net-подобного пользовательского элемента управления в iOS Framework - PullRequest
2 голосов
/ 13 ноября 2011

То, что я пытаюсь сделать, это то, что я знаю, просто в ASP.Net, и, возможно, мне просто нужно скорректировать свое мышление (я учу себя разработке на iOS), но не могу понять, как чтобы добиться этого лучше всего с XCode / Objective-C.

Я хочу расположить несколько кнопок, метку и написать код в многократно используемом формате, например, в пользовательском элементе управления ASP.Net. Затем возьмите этот «пакет» и используйте его в нескольких местах в виде раскадровки.

Я видел много примеров для создания подклассов одного элемента управления, но я хочу собрать вместе несколько элементов управления, а затем перетащить / добавить их в раскадровку. Это возможно? Или мне нужно создать файл класса, но вручную добавить все элементы управления, чтобы связать их с классом? Или лучше / можно динамически добавлять элементы управления в представление / раскадровку с помощью пользовательского класса?

1 Ответ

0 голосов
/ 14 ноября 2011

Так что, если вы хотите проектировать в IB, вам нужно проделать немного больше работы.

Для начала нам нужно что-то, чтобы содержать наши элементы управления и действовать как контроллер, поэтому нам нужен подкласс NSObject и назовите это чем-то разумным.(Лучше, чем MyWidget)

@interface MyWidget : UIView

для того, чтобы наш базовый начальный холст лежал на наших компонентах, нам понадобится UIView, с которым IB может справиться и использовать.Добавьте это в свой заголовок

@property (nonatomic, retain) IBOutlet UIView *view;

Затем дайте этому ивару метод получения / установки и выполните управление памятью в .m

@synthesize view = _view;

...

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

Теперь создайте наконечник с одним представлением, чтобы начатьи установите File's Owner на MyWidget.Теперь вы сможете ctrl + click и перетащить из File's Owner в UIView объект и выбрать view.Таким образом, в этот момент наш кончик знает, как подключиться к нашему MyWidget классу, но наш MyWidget класс не знает о кончике.

В MyWidget.m нам нужно указать классу использовать перои в - (id)initWithFrame:(CGRect)frame;, и в - (id)initWithCoder:(NSCoder *)aDecoder;, чтобы мы могли создать экземпляр класса в коде или с помощью IB.

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self loadView];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self loadView];
    }
    return self;
}

- (void)loadView;
{
    [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
    [self addSubview:self.view];
}

Теперь, когда создается экземпляр класса out, он подключается к перу.К этому моменту вы вернулись к тому, как вы обычно работаете со стандартным UIViewController, например, добавьте что-то в xib, затем подключите его к контроллеру и используйте его.

В целом хорошая начальная точка будет выглядеть так...

MyWidget.h

#import <UIKit/UIKit.h>

@interface MyWidget : UIView

@property (nonatomic, retain) IBOutlet UIView *view;

@end

MyWidget.m

#import "MyWidget.h"

@interface MyWidget ()

- (void)loadView;

@end

@implementation MyWidget

@synthesize view = _view;

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

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self loadView];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self loadView];
    }
    return self;
}

- (void)loadView;
{
    // MyWidget is the name of the xib as well
    [[NSBundle mainBundle] loadNibNamed:@"MyWidget" owner:self options:nil];
    [self addSubview:self.view];
}

@end
...