#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