Ich habe ein Problem, bei dem beim Abrufen des SKProduct-Gebietsschemapreises auf den label.text meiner UICollectionView die korrekte Anzeige erfolgt. Die Preise springen jedoch in verschiedenen Labels, je nachdem, wie schnell die Seite geladen wird.

TopUpViewController (UICollectionView) -> TopUpMoneyCell (MoneyLabel)

Irgendeine Idee, wie man das löst? Derzeit rufe ich SKProduct in TopUpMoneyCell auf. Ich habe ein Array von 4 in App-Produkt zu nennen, jedes mit unterschiedlichem Wert.

Soll ich es stattdessen von TopUpViewController aus aufrufen? Wenn ja, wie soll ich die Daten, die ich von TopUpViewController erhalten habe, nach TopUpMoneyCell ziehen?

Edit 1: UI Mockup hinzugefügt, nochmals vielen Dank für den Kommentar.

Ansicht des UI-Modells

1
JG_ 19 Feb. 2020 im 18:12

3 Antworten

Beste Antwort

Okay, ich habe es geschafft, mein Problem zu lösen. Würde mich freuen, wenn jemand helfen könnte, meinen Code zu vereinfachen :) Unten ist ein Auszug aus dem Code.

#import "TopUpMoneyCell.h"
#import "TopUpMoneyModel.h"
#import <StoreKit/StoreKit.h>

@interface TopUpMoneyCell() <SKProductsRequestDelegate>
@property (nonatomic,strong) NSString *purchID;
@property (nonatomic,strong) NSArray *products;
@property (nonatomic,strong) NSArray *productID;
@property (nonnull,strong) IAPCompletionHandle handle;
@property (strong,nonatomic) SKProductsRequest *request;
@property (strong,nonatomic) SKProduct *firstProduct;
@property (strong,nonatomic) SKProduct *secondProduct;
@property (strong,nonatomic) SKProduct *thirdProduct;
@property (strong,nonatomic) SKProduct *fourthProduct;
@property (strong,nonatomic) NSString *firstProductPrice;
@property (strong,nonatomic) NSString *secondProductPrice;
@property (strong,nonatomic) NSString *thirdProductPrice;
@property (strong,nonatomic) NSString *fourthProductPrice;
@property (nonatomic, weak) UILabel *firstPriceLabel;
@property (nonatomic, weak) UILabel *secondPriceLabel;
@property (nonatomic, weak) UILabel *thirdPriceLabel;
@property (nonatomic, weak) UILabel *fourthPriceLabel;
@end

@implementation AQTopUpMoneyCell

- (UILabel *)priceLabel {
    if (!_priceLabel) {
        UILabel *label = [[UILabel alloc] init];
        _priceLabel = label;
        label.textAlignment = NSTextAlignmentCenter;
        label.text = @"";
    }
    return _priceLabel;
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self productsInfoRequest];
        [self cnyLabel];
    }
    return self;
}

- (void)productsInfoRequest {
                _productID = [NSArray arrayWithObjects:@"100",@"200",@"300",@"400", nil];
               SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:_productID]];
                request.delegate = self;
                [request start];
    }

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    {
        NSSortDescriptor *mySortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"price" ascending:NO];
        NSMutableArray *_productsAvailable = [[NSMutableArray alloc] initWithArray:response.products];
        [_productsAvailable sortUsingDescriptors:[NSArray arrayWithObject:mySortDescriptor]];

        self.firstProduct = response.products[0];
        self.secondProduct = response.products[1];
        self.thirdProduct = response.products[2];
        self.fourthProduct = response.products[3];

        NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
        [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
        [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
        [numberFormatter setLocale:_firstProduct.priceLocale];
        self.firstProductPrice = [numberFormatter stringFromNumber:_firstProduct.price];
        self.secondProductPrice = [numberFormatter stringFromNumber:_secondProduct.price];
        self.thirdProductPrice = [numberFormatter stringFromNumber:_thirdProduct.price];
        self.fourthProductPrice = [numberFormatter stringFromNumber:_fourthProduct.price];

        static int counter = 0;
        if (counter == 4) {
            counter = 0;
        }
        if ( [_productsAvailable count] > 0){
            if (_indexPath.row == 0)
            {[self.priceLabel setText:_firstProductPrice];}
            if (_indexPath.row == 1)
            {[self.priceLabel setText:_secondProductPrice];}
            if (_indexPath.row == 2)
            {[self.priceLabel setText:_thirdProductPrice];}
            if (_indexPath.row == 3)
            {[self.priceLabel setText:_fourthProductPrice];}
            counter++;
        }
    }

#pragma mark - SKProductsRequestDelegate
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
#if DEBUG
    NSLog(@"log-IAP> request -> failedWithError: %@", error);
    [SVProgressHUD showErrorWithStatus:@"Request timed out. Try again later."];
#endif
}

- (void)requestDidFinish:(SKRequest *)request{
#if DEBUG
    NSLog(@"log-IAP> requestDidFinish?");
#endif
}


- (void)setIndexPath:(NSIndexPath *)indexPath {
    _indexPath = indexPath;
    NSString *imageName = [NSString stringWithFormat:@"touupbg_%ld",indexPath.row];
    self.bgImageV.image = [UIImage imageNamed:imageName];
    if (indexPath.row == 0) {
        [self.bgImageV mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(kScale(367*scale));
            make.width.equalTo(kScale(308*scale));
        }];
    } else if (indexPath.row == 1) {
        [self.bgImageV mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(kScale(380*scale));
            make.width.equalTo(kScale(308*scale));
        }];
    }else if (indexPath.row == 2) {
        [self.bgImageV mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(kScale(373*scale));
            make.width.equalTo(kScale(316*scale));
        }];
    }else if (indexPath.row == 3) {
        [self.bgImageV mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(kScale(403*scale));
            make.width.equalTo(kScale(308*scale));
        }];
    }else if (indexPath.row == 4) {
        [self.bgImageV mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(kScale(400*scale));
            make.width.equalTo(kScale(308*scale));
        }];
    }else if (indexPath.row == 5) {
        [self.bgImageV mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(kScale(401*scale));
            make.width.equalTo(kScale(317*scale));
        }];
    }
}
@end
0
JGSG 21 Feb. 2020 im 21:07

Sehen Sie sich an, wie Sie die Funktion prepareForReuse() in Ihrem TopUpMoneyCell überschreiben. Brechen Sie in dieser Funktion alle asynchronen Anrufe ab, mit denen Sie möglicherweise begonnen haben, den Preis zu laden.

0
picciano 19 Feb. 2020 im 22:07

Ohne Code zu sehen, ist es etwas schwierig zu sehen, was Sie tun, aber es scheint, als ob Sie möchten, dass Ihr TopUpViewController dem UICollectionViewDataSource-Protokoll (https://developer.apple.com/documentation/uikit/uicollectionviewdatasource?language=objc)

Dann könnten Sie dort so etwas implementieren:


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell* cell = [self.testCollectionView dequeueReusableCellWithReuseIdentifier:@"SomeReuseID"
                                                                                    forIndexPath:indexPath];

    // set your custom labeling on the cell here (you probably have a subclass)

    return cell;
}

Vergessen Sie nicht, der UICollectionView mitzuteilen, was für ihre dataSource verwendet werden soll.

Nach dem, was Sie beschreiben, klingt es so, als würden Ihre Zellen eine Datenquelle direkt abfragen. Wenn UICollectionView eine Zelle wiederverwendet, befinden sich die Beschriftungen nicht in der von Ihnen beabsichtigten Reihenfolge.

0
BenW 19 Feb. 2020 im 22:36