Nano Hash - криптовалюты, майнинг, программирование

Отправить NSMutableArray в UIViewController

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

Итак, у меня есть UIViewController с NSMutableArray (который выдвигается, если пользователь выбирает ячейку из RootViewController)

e.g.

Код в RootViewController, когда пользователь выбирает ячейку:

QueryTableViewController *queryTableView 
        = [[QueryTableViewController alloc] initWithQuery:query];
[self.navigationController pushViewController:queryTableView animated:YES];
[queryTableView release];

Код в QueryTableViewController

@interface QueryTableViewController : UIViewController{
NSMutableArray *results;
}

@implementation QueryTableViewController // more code
-(int)fetchQueryWithString:(NSString*)string{
    // Searching twitter.
    // add objects in the results array.
    // **HERE** Once I gather all the objects I am posting a notification:
}

С другой стороны, у меня есть DetailViewController, который пуст и нуждается в массиве для создания другого UIViewController и добавления подпредставления. например

 // when the notification is received  
 self.statsTableView = [[StatsTableVC alloc] initWithTweets:**HERE**];   
 [self addSubView:self.statsTableView];

В данный момент я публикую уведомление в конце метода fetchQueryWithString для совместного использования массива. Я хотел бы знать, есть ли лучший способ отправить его другому UIViewController?

(Что, я уверен, есть ;)

Заранее спасибо.


Ответы:


1

Существует два метода обработки данных между несколькими контроллерами представления.

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

В вашем случае ваш объект данных представляет собой просто изменяемый массив. Вы должны определить свойство для хранения массива в каждом контроллере представления, который будет его использовать. Итак, в вашем RootViewController вы должны определить свойство NSMutableArray, создать пустой массив, а затем передать его следующему контроллеру представления при загрузке.

QueryTableViewController *queryTableView 
        = [[QueryTableViewController alloc] initWithQuery:query];
queryTableView.results=self.queryResults;
[self.navigationController pushViewController:queryTableView animated:YES];
[queryTableView release];

Поскольку экземпляр RootViewController и экземпляр QueryTableViewController имеют общую ссылку на один и тот же изменяемый массив, каждый как доступ к изменениям, сделанным другим.

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

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

Чтобы получить делегат приложения в любом месте приложения:

AppDelegateClassName *appDelegate=(AppDelegateClassName *)[[NSApplication sharedApplication]  delegate]; 

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

NSMutableArray *localResults=appDelegate.results;

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

05.07.2011
  • Спасибо за Вашу информацию. Было бы плохим выбором сделать detailViewController одноэлементным и установить массив? 05.07.2011
  • Да, у любого контроллера нет причин быть синглтоном. Контроллеры всегда настраиваются для своего конкретного представления и модели данных. Таким образом, делать один синглтон совершенно бессмысленно. Контроллеры не содержат каких-либо важных данных в структуре Модель-Представление-Контроллер, которую использует Apple API. Они должны просто иметь ссылку на объект модели данных, который может быть любым из простого массива, пользовательского объекта или (лучше всего) стека Core Data. 05.07.2011
  • Я создал объект репозитория как синглтон, чтобы использовать массив на отдельных контроллерах. Спасибо еще раз. 05.07.2011

  • 2

    вы можете сделать свой array доступным через singleton class если его можно использовать в нескольких классах вашего приложения.

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

    05.07.2011

    3

    В следующих шагах используется массив в классе B, который был создан в другом классе A.

    В файле реализации класса A над @implementation объявите массив следующим образом:

    NSArray *array;
    @implementation
    

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

    array = arrMutable;
    

    Теперь в вашем классе B выше @implementation extern, как

    extern NSArray *array;
    @implementation
    

    Теперь у вас есть все элементы в вашем массиве, которые были в массиве nsmutable

    Надеюсь, поможет...........

    05.07.2011

    4

    пожалуйста, импортируйте файл appdelegate .h, в котором класс вы хотите использовать массив nsmutuable. затем свойство определяется в массиве nsmutable в классе appdelegate.

    то какой класс вы хотите использовать массив.

        [yourappdelegateclass sharedinstance].appdelegatearray = yourarray;
    
    27.12.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..