Как создать многоразовые элементы управления iOS? - PullRequest
27 голосов
/ 24 июня 2011

Как новый разработчик iOS, я пытаюсь определить лучший подход к созданию многоразовых элементов управления в iOS4 +.Например, если я хотел создать настраиваемый UIImageView, который можно было бы использовать в нескольких других представлениях, что является лучшим подходом.

Я создал элемент управления, включающий следующие файлы:

  • MyImageViewController.h
  • MyImageViewController.m
  • MyImageViewController.nib

Предположим, что янужен элемент управления, который использует файл .nib.

Как мне сделать следующее:

  1. Создать экземпляр пользовательского элемента управления в другом представлении, программно и через IB?
  2. Как мне структурировать пользовательский элемент управления, чтобы он мог отображать «события», например, ontouch?
  3. Как мне структурировать пользовательский элемент управления, чтобы я мог вызывать действия / методы, например loadImage ()?

Любые идеи или ссылки приветствуются.Спасибо

Ответы [ 3 ]

7 голосов
/ 24 июня 2011

Вы , вероятно, не будут использовать nib / xib для создания многоразового представления 'control'. iOS сильно отличается от того, к чему вы привыкли, скажем, Java или .NET. Для некоторых видов представлений вы создадите xib и контроллер / класс, который его поддерживает - UITableViewCell является примером этого.

Хотел бы я дать вам пошаговое руководство, как добиться того, что вы пытаетесь сделать, но я не могу, потому что у меня недостаточно информации о том, что вы на самом деле пытаетесь сделать. На сайте для разработчиков Apple есть несколько замечательных руководств, которые знакомят вас с взаимодействиями событий View / Controller / Touch, но сайт не отвечает прямо сейчас (я полагаю, из-за выпуска видео WWDC). Кстати, просмотр видео с WWDC 2010 - это еще один отличный способ узнать о том, чего вы пытаетесь достичь, особенно сессии UIKit.

Вы не собираетесь создавать «элементы управления», как вы, вероятно, привыкли к ним, но пользовательские объекты-потомки UIView и пользовательские объекты-потомки UIViewController. В моих проектах я обнаружил очень очень несколько сценариев, в которых создание многоразового UIView было полезным (кроме UITableViewCells). Подавляющее большинство кода многократного использования в проекте iOS - это ViewControllers. Вы будете выставлять события с помощью делегирования - ваш контроллер определит делегата, который будет реализован другим объектом, и получит вызовы методов от вашего контроллера для обработки того, что было делегировано. Опять же, руководства Apple и видео WWDC объясняют это очень хорошо.

Вот пример многоразового контроллера и его использования:

MyEntityViewController.m

- (id)initWithEntity:(EntityFoo *)theEntity inEditMode:(BOOL)inEditMode {
  self = [super initWithNibNamed:@"EntityFooView" bundle:nil];
  if(self) {
    //retain entity somewhere
    //dont setup view in here!
  }
  return self;
}

- (void)viewDidLoad {
  //setup view in here. This ensures compatibility with standalone operation
}

RootViewController.m

- (void)viewDidLoad {
  [super viewDidLoad];

  EntityViewController *evc = [[EntityViewController alloc] initWithEntity:self.someEntity inEditMode:NO];
  [self.view addSubview:evc.view];

  //You MUST call this method, the framework will not call it on sub-controllers
  [evc viewDidLoad];

  self.entityViewController = evc;
  [evc release];
}

Это не полная реализация, так как ваш опыт и инфраструктура растут, вы найдете шаблон уведомления (подсказка) субконтроллеров событий о событиях в главном контроллере представления. Я настоятельно рекомендую вам посмотреть видео с WWDC 2011, если у вас есть к ним доступ, поскольку в следующей ОС что-то будет иметь отношение к этой теме.

6 голосов
/ 31 октября 2011

Вот статья , которая описывает, как создать повторно используемый элемент управления с пером.Раздел под названием «Повторно используемое подпредставление» звучит так, как вы хотите.

Вопреки сказанному @RyanR, совершенно нормально создать элемент управления многократного использования в iOS.Это не образец, который я видел много, но вы можете сделать это полностью.

0 голосов
/ 22 июля 2015

Это моя версия для раскадровки.

Добавление идентификатора контроллера представления:

enter image description here

в файле .h создает свойство для сохранения контроллера.В противном случае он будет удален из памяти:

@property (nonatomic, strong) TestViewController *timetableViewController;

в файле .m:

-(void)viewDidLoad{
    [super viewDidLoad];
    TestViewController *centerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"VIEW_CONTROLLER_ID"];
    [self.view addSubview:centerViewController.view];
    [centerViewController viewDidLoad];
    self.timetableViewController = centerViewController;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...