Создать пользовательский элемент управления, подобный ASP.Net, в среде iOS

#asp.net #objective-c #ios #interface-builder #user-controls

#asp.net #objective-c #iOS #конструктор интерфейса #пользовательские элементы управления

Вопрос:

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

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

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

Ответ №1:

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

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

 @interface MyWidget : UIView
  

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

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

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

 @synthesize view = _view;

...

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

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

В MyWidget.m нам нужно указать классу использовать nib в обоих - (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 class, он подключается к кончику. На этом этапе вы возвращаетесь к тому, как вы обычно работаете со стандартом 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