2015-09-24 1 views
0

У моего приложения есть окно поиска (панель поиска), которое используется во всем приложении. Я не хочу создавать дублированный код, поэтому я создал контроллер вида, называемый MySearchViewController, для обработки задания поиска, а затем создал объект Singleton в AppDelegate. В каждом контроллере просмотра я добавил свое поисковое представление следующим образом:Может ли тот же ViewController.view быть добавлен как subview для разных представлений в качестве Singleton?

- (void)viewDidLoad 
{ 
    MySearchViewController* search = [AppDelegate searchViewController]; 
    [self.view addSubView:search.view]; 
} 

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

+0

Вы можете найти: «У Views может быть только один супервизор. Если в представлении уже есть супервизор, и этот вид не является получателем, этот метод удаляет предыдущий супервизор, прежде чем сделать получателю новый супервизор». в 'addSubview' справки класса UIView'. – KudoCC

ответ

1

Поймите, что вы смешиваете некоторые понятия, которые не обязательно связаны: избегайте дублирования кода и синглтонов.

Википедия говорит это о одиночках:

В программной инженерии, одноэлементный шаблон является шаблоном, который ограничивает создание экземпляра класса к одному объекту. Это полезно, когда необходим один объект для координации действий в системе. Концепция иногда обобщается на системы, которые работают более эффективно, когда существует только один объект, или которые ограничивают создание экземпляра определенным количеством объектов. Термин исходит из математической концепции одноэлементности.

Самая важная характеристика синглтона (по моему скромному мнению) заключается в том, что объект создается только один раз, и каждое отдельное место в вашем приложении будет использовать один и тот же экземпляр. Ну, чтобы использовать функцию поиска везде и избегать дублированного кода, вам не нужно, чтобы поисковое представление создавалось только один раз, возможно, данные, которые идут с ним, , но не само представление.

Два лучших способов достижения этой цели:

1 - Вы можете создать ViewController с вашим поиском и просто встраивать это на другие представления с помощью контейнера View, вы можете использовать блоки или протокол делегата для обмена данными между контроллер и представление, которое его внедряет.

2 - Вы можете создать родительский класс ViewController, который будет включать панель поиска, такую ​​как SearchViewController, и все остальные viewControllers, которые нуждаются в одной и той же функции, будут унаследованы от нее.

Singleton может быть полезен, если вы планируете совместно использовать одни и те же данные поиска и текст между всеми ViewControllers приложения, но это будет одноэлемент только с этой информацией, UISearchBar и все другие элементы представления не должны быть часть синглтона.

+0

Спасибо за ваш ответ. Я использую singleton, потому что в режиме поиска есть много условий поиска, когда пользователь выбирает некоторые условия (например, мужчина/женщина), а затем переходит к другому виду, я хочу, чтобы условия сохранялись. –

+0

Так что используйте Singleton для сохранения условий в массиве, словаре, строках и т. Д. Но не в представлениях –

+0

Я рассмотрел использование базового класса, но не хочу, чтобы базовый класс стал слишком большим. –

0

Если вы хотите добавить вид из другого контроллера вида, ваш контроллер представления должен быть контроллером Родительского представления этого точки зрения контроллера:

- (void)viewDidLoad 
{ 
    MySearchViewController* search = [AppDelegate searchViewController]; 
    [self addChildViewController:search]; 
    [self.view addSubView:search.view]; 
} 

также, чтобы убедиться, что при добавлении search.view, он уже инициализирован.

0

Почему вы не используете класс NSObject?, Я не знаю вашего требования, но если вы хотите сохранить последнее обновленное значение в целом проекте (в исполнении), то вы должны использовать синглтон, но если вы не хотите (я имею в виду один результат для всего проекта), тогда вы должны использовать производный класс NSObject. Преимущество - одноточечная потребляет память, поэтому память будет потрачена впустую. Класс NSObject будет повторно использоваться и выделяться только тогда, когда это требуется, и тогда ARC позаботится обо всех вещах. Если вы хотите знать, как создать NSObject и использовать его, вы можете дать мне ответ.

+0

Это поможет вам http://rypress.com/tutorials/objective-c/classes –

0

Вот некоторый код для загрузки XIB как части пользовательского объекта с инициализацией объекта.

Почему вы не создаете компонент пользовательского поиска для поиска?

вы можете использовать этот компонент во всем приложении. также не создает дубликат кода.

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [[[NSBundle mainBundle] loadNibNamed:@"SearchView" owner:self options:nil] objectAtIndex:0]; 
     [self addSubview:self.view]; 
     self.frame = self.view.frame; 
    } 
    return self; 
} 
0

Пожалуйста, проверьте код ниже. Надеюсь, это работа для вас.

- (void)viewDidLoad 
{ 

    if ([self.view viewWithTag:123456]) { 
     [[self.view viewWithTag:123456] removeFromSuperview]; 
    } 

    MySearchViewController* search = [AppDelegate searchViewController]; 
    search.view.tag = 123456; // give a any random tag to view 
    [self.view addSubView:search.view]; 
    [self addChildViewController:search]; 
} 

Пожалуйста, убедитесь, что данный тег не присваивается другому объекту, кроме search.view в self.view.

Благодаря

1

В идеале, вы должны создать экземпляр свежий экземпляр MySearchViewController каждый раз, когда вы хотите добавить его в другой точке зрения, чтобы избежать проблем.

Необходимо ли удалить вид из последнего представления перед добавлением в текущий вид?

Его не требуется удалять из предыдущего супер-представления, потому что всякий раз, когда вы добавляете этот вид однопользовательского MySearchViewController к другому виду, он автоматически удаляется из последнего супер-представления, и теперь его супер-просмотр - это ваш новый вид, в который вы добавили Это.

 Смежные вопросы

  • Нет связанных вопросов^_^