1

UITableView画像、テキスト、開示ボタンを含むセルを持っています。私はこのようにセルをロードしています:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *cellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    if ([indexPath row] == [[self multas] count]) {
        [[cell textLabel] setText:@"Carregar mais..."];
    } 
    else 
    {
        Multa *multa = [self.multas objectAtIndex:indexPath.row];

        NSString *dataIsolada = [[NSString stringWithFormat:[multa dataOcorrencia]] substringWithRange:NSMakeRange(0, 10)];

        [[cell textLabel] setText:[NSString stringWithFormat:dataIsolada]];
        [[cell detailTextLabel] setText:[multa descricao]];
        [cell.imageView setImageWithURL:[NSURL URLWithString:[multa fotoURL]]
                       placeholderImage:[UIImage imageNamed:@"carregando.jpeg"]];
        [cell.imageView setContentMode: UIViewContentModeScaleAspectFit];
        [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
    }

    return cell;
}

ユーザーが開示ボタンをタップすると、開示ボタンをアクティビティ インジケーターに切り替えてから、ナビゲーション コントローラーを使用して別のビューを画面にプッシュします。

- (void)carregarDetalhesMulta:(UITableView *)tableView comMulta:(Multa *)multa 
{
    DetalheMultaViewController *form = [[DetalheMultaViewController alloc] initWithMulta:multa];
    form.delegate = self;

    UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:form];

    [self presentModalViewController:navigation animated:YES];
}

- (void) tableView: (UITableView *) tableView accessoryButtonTappedForRowWithIndexPath: (NSIndexPath *) indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray];
    spinner.frame = CGRectMake(0, 0, 24, 24);
    cell.accessoryView = spinner;
    [spinner startAnimating];

    Multa *multa = [self.multas objectAtIndex:indexPath.row];

    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

       [spinner stopAnimating];
       [self carregarDetalhesMulta:tableView comMulta:multa];
       [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
    });

}

最後に、開示ボタンのアクセサリを元に戻したことに注意してください。問題は、(ボタンをタップして) を含むビューに戻ると、UITableViewタップした行に開示ボタンもアクティビティ インジケーターも表示されないことです。私が間違っていることは何ですか?テーブル ビューをリロードせずにこれらのコントロールを切り替えるより良い方法は何ですか?

4

2 に答える 2

2

プロパティは、プロパティaccessoryViewよりも優先されaccessoryTypeます。を に設定するaccessoryViewnil、アクセサリ ボタンが再び表示されます。

于 2013-04-02T04:33:39.540 に答える
0

質問から私が理解したことは次のとおりです。アクセサリ ビューを、タップするとアクティビティ インジケータになる開示ボタンにしたいと考えています。少し遅れて、新しいView Controllerにプッシュしたいと思います。

これが私がそれを行う方法です:

  1. ストーリーボードのプロトタイプ セルを設定して、Accessory:none を設定します。
  2. View Controller から目的の宛先 VC にプッシュ セグエを追加し、@"MyPushSegue" などの識別子を付けます。

cellForRowAtIndexPath で、accessoryView をセルに追加します (セルがない場合)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    // the rest of your cellForRowAtIndexPath

     if (!cell.accessoryView)
        cell.accessoryView = [self createAccessoryView];

    return cell;
}

この方法でアクセサリ ビューを作成します (ARC を想定):

- (UIView *)createAccessoryView {

    UIView *accessoryView = [[UIView alloc] initWithFrame:CGRectZero];
    UIButton *disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    disclosureButton.tag = 100;
    [disclosureButton addTarget:self action:@selector(pressedAccessory:) forControlEvents:UIControlEventTouchUpInside];

    UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    aiv.tag = 101;
    aiv.alpha = 0.0;
    aiv.center = disclosureButton.center;

    accessoryView.bounds = disclosureButton.bounds;
    [accessoryView addSubview:aiv];
    [accessoryView addSubview:disclosureButton];
    return accessoryView;
}

上記の開示ボタンは、ボタンが押されたときにメソッドをトリガーします。このメソッドは、セレクター ビューの状態を変更し、ストーリーボードで設定したプッシュ セグエをトリガーする必要があります。

- (void)pressedAccessory:(UIButton *)sender {

    UIView *accessoryView = sender.superview;
    [self setAccessoryView:accessoryView waiting:YES];

    // let the user see the spinner for 1 seconds
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
        [self performSegueWithIdentifier:@"MyPushSegue" sender:self];
        [self setAccessoryView:accessoryView waiting:NO];
    });
}

最後に、あなたが抱えていた問題を解決するために、アクセサリ ビューをスピナーに置き換えるのではなく、必要な状態に応じて、ボタンを非表示/表示し、スピナーを非表示/表示することで、外観を変更します。

- (void)setAccessoryView:(UIView *)accessoryView waiting:(BOOL)waiting {

    UIButton *disclosureButton = (UIButton *)[accessoryView viewWithTag:100];
    UIActivityIndicatorView *aiv = (UIActivityIndicatorView *)[accessoryView viewWithTag:101];
    [UIView animateWithDuration:0.1 animations:^{
        disclosureButton.alpha = (waiting)? 0.0 : 1.0;
        aiv.alpha = (waiting)? 1.0 : 0.0;
    }];

    if (waiting) [aiv startAnimating]; else [aiv stopAnimating];
}
于 2013-04-02T04:29:29.670 に答える