Отслеживание изменений в UIView - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть подкласс UIView (currentMapView), который рисует карту нескольких состояний, используя серию CGMutablePaths, извлеченных из файла XML.Когда пользователь нажимает на состояние, цвет заливки меняется с зеленого на фиолетовый.Прямо сейчас я выясняю, какое состояние было изменено на лету, используя CGPathContainsPoint, чтобы сообщить, какой путь был выбран, и затем я установил цвет заливки этого пути и перезагрузил представление, используя setNeedsDisplay.У меня проблема в том, что мне нужно повторно использовать currentMapView несколько раз (разные группы состояний), и я не уверен, как мне следует отслеживать пути, по которым пользователь нажал, чтобы я мог снова их покрасить, когда я перезагружаюпредставление из файла XML.

Вот пошаговый пример того, что я делаю:

  1. currentMapView загружает данные пути из файла XML и рисует картуВосточная часть Соединенных Штатов.

  2. Пользователь нажимает на Флориду, и он становится фиолетовым (я вызываю 'setNeedsDisplay' на currentMapView после установки цвета заливки пути Флорида с помощью CGContextSetFillColorWithColor)

  3. Пользователь касается Северной Каролины, и он становится фиолетовым (я вызываю 'setNeedsDisplay' на currentMapView после установки цвета заливки пути Северной Каролины с помощью CGContextSetFillColorWithColor)

  4. Пользовательпереходит к другому представлению, и мне нужно нарисовать другую группу состояний в currentMapView (стирая, что там).

    Everything отлично работает здесь.

  5. Когда пользователь возвращается к виду с первого шага, и я снова рисую карту восточной части Соединенных Штатов, мне нужно раскрасить пути Флориды и Северной Каролины.снова.

Каков наилучший способ отслеживать пути, по которым пользователь нажал?

1 Ответ

2 голосов
/ 17 февраля 2012

Самый простой способ - создать глобальную переменную NSMutableSet с именем statesTouched. Инициализируйте его в пустой набор в application:didFinishLaunchingWithOptions:.

Каждый раз, когда пользователь касается состояния, добавьте название состояния (или ссылку на объект, представляющий состояние) в набор:

[statesTouched addObject:touchedStateName];

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

for (NSString *stateName in viewStateNames) {
    if ([statesTouched member:stateName]) {
        [self setColor:[UIColor purpleColor] forStateName:stateName];
    }
}
...