문제

따라서 송장과 인보이스 라인 템의 두 가지 객체가 있습니다. InvoicelineItem에는 부동산이 있습니다 cost 그리고 다른 속성을 기반으로 동적으로 생성됩니다. 내가 사용하는 KVO/바인딩을 돕기 위해 :

+ (NSSet *)keyPathsForValuesAffectingCost {
    return [NSSet setWithObjects:@"lineItemType", @"serviceCost", @"hourlyRate", @"timeInSeconds", @"productCost", @"quantityOfProduct", @"mileageCost", @"milesTraveled", nil];
}

이것은 훌륭합니다. serivcecost와 같은 속성을 편집하면 테이블 뷰의 기본 비용이 잘 알려져 있습니다.

송장 객체에는 송장의 NSMutableARRAY가 있습니다. 송장에는 유사한 속성이 있습니다 totalCost. 라인 항목을 반복하여 계산되며 라인 항목이 삭제 된 것으로 표시되지 않는 한 비용을 추가하고 TotalCost를 생성합니다.

이제 내 질문/문제. 라인 항목의 비용 중 하나가 변경되었을 때 KVO/바인딩으로 작동하도록 송장의 TotalCost를 설정하려면 어떻게해야합니까?

설정을 시도했습니다.

+ (NSSet *)keyPathsForValuesAffectingTotalCost {
    return [NSSet setWithObjects:@"lineItems.cost", nil];
}

그러나 그것은 작동하지 않습니다. 콘솔에 오류가 발생합니다. [<NSCFArray 0x1499ff40> addObserver:forKeyPath:options:context:] is not supported. Key path: cost

도움이 되었습니까?

해결책

나는 단호한 관계가 자동 KVO 비도를 위해 뒷받침된다고 믿지 않습니다. 이 문서는 어떤 식 으로든 설명을하지는 않지만, KVO에 대해 내가 알고있는 것에서, kVO에 대해 알고있는 것은, 이의 관계의 하위 키를 관찰하는 것은 사소한 경향이 있습니다.

내가 이것에 접근하는 방법은 수동으로 관찰하는 것입니다. cost 각각의 KVC 액세서를 구현함으로써 각 송장 라인 셋 객체의 속성 lineItems 삽입/제거 메소드에서 addobserver/remobserver 호출을 수행하는 송장 클래스의 속성을 각각 트리거합니다. totalCost WillChangeValueforKey :/didchangeValueForKey :. 따라서 이와 같은 것 (대략 스케치 된 코드, 면책 조항 등) :

- (void)insertObject:(InvoiceLineItem*)newItem inLineItemsAtIndex:(unsigned)index
{
    [newItem addObserver:newItem forKeyPath:@"cost" options:0 context:kLineItemContext];
    [lineItems insertObject:newItem atIndex:index];
}

- (void)removeObjectFromLineItemsAtIndex:(unsigned)index
{
    [[lineItems objectAtIndex:index] removeObserver:self forKeyPath:@"cost"];
    [lineItems removeObjectAtIndex:index];
}

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
    if (context == kLineItemContext)
    {
        [self willChangeValueForKey:@"totalCost"];
        [self didChangeValueForKey:@"totalCost"];
    }
}

다른 팁

더 짧은 솔루션을 시도 할 수 있습니다.

헤더 파일에 추가 :

@property (retain, readonly) NSDecimalNumber *accountBalance;

구현 파일에 추가하십시오

- (NSDecimalNumber *)totalCost
{
    return [self valueForKeyPath:@"InvoiceLineItems.@sum.cost"];
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top