КВО Несколько объектов - PullRequest
1 голос
/ 07 июля 2011

У меня есть три объекта, Alien, Balloon и Joystick, каждый из которых имеет свойство Location, которое я хотел бы наблюдать с одного контроллера.

, когда контроллер наблюдает за изменением переменной Location любогоиз объектов, он обновляет свойства центра соответствующих представлений в соответствии с местоположением модели.

Моя проблема заключается в том, что я использую следующую функцию:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

Параметр Object, который имееттип id, используется для поиска правильного индекса в моем MutableArray объектных моделей, а затем с соответствующим индексом в моем MutableArray представлений я меняю центр представления ..

Однако .. потому чтопараметр имеет тип id, а не (Balloon *), (Joystick *) или (Alien *), xcode жалуется, что Location не является членом объекта в следующем коде:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    int index;

    if ([keyPath isEqualToString:@"Location"])
    {
        index = [balloons indexOfObjectIdenticalTo:object];

        [[balloonVs objectAtIndex:index] setCenter:CGPointMake(object.Location.x, object.Location.y)];
    }
}

Я понимаюпочему это не работает .. но не знаю, как я мог это исправить.

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

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

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    int index;

    if ([keyPath isEqualToString:@"Location"])
    {
        index = [balloons indexOfObjectIdenticalTo:object];

        [[balloonVs objectAtIndex:index] setCenter:CGPointMake([object Location].x, [object Location].y)];
    }
}
1 голос
/ 07 июля 2011

Вам нужно привести его к нужному типу.Например, вместо:

object.location

... используйте:

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