2017-12-26 22 views
0

Ich habe versucht, eine statische Tabellenansicht als Einstellungen/Optionen für die Alarmfunktion in meiner App zu verwenden. Ich war in der Lage, verschiedene ViewControllers zu übergeben und Daten zu aktualisieren und Werte zu aktualisieren.UITableViewCell detailTextLabel aktualisiert seinen Text nicht, wenn ihm ein neuer Wert zugewiesen wird

Ever MPMediaPickerController wird die Daten gerne zurückgeben und es wird sogar den Delegaten mit dem richtigen Wert aktualisieren, nachdem ich den Wert gespeichert habe, aber es wird die DetailTextLabel nicht aktualisieren, bevor ich das AlarmObject speichern. Ich kann in meinen Protokollen sehen, dass das Objekt sogar mit den richtigen Werten gespeichert wird, wenn der ViewController beendet wird. Die einzige seltsame Sache ist, dass das fragliche VC ein Kind VC eines anderen VC ist, aber ich denke nicht, dass das das Problem ist.

Wenn es hilft, sind alle VCs auch Teil eines UINavigationController mit Ausnahme des MediaPicker.

Ich habe versucht, die Daten neu zu laden, die Änderung auf dem Hauptthread zu verzögern, den Hauptthread zu verzögern, um alle Änderungen ausführen zu lassen, die spezifische Zeile für wo die MediaCell ist, needsDisplay und needsLayout und layoutIfNeeded für die Zelle aufzurufen, nichts funktioniert. Irgendwelche Vorschläge sind sehr willkommen, da ich mich in den letzten Tagen immer wieder dagegen gewehrt habe und frustrierend wurde.

#import "AddAlarmTableViewController.h" 
#import "ToneTableViewController.h" 

@interface AddAlarmTableViewController() 

@property (weak, nonatomic) IBOutlet UITableViewCell *mediaCell; 

@end 

@implementation AddAlarmTableViewController 


@synthesize previousLabel, previousSoundAsset, previousRepeatArray,alarmDelegate,mediaCell; 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:NO]; 
    if(previousSoundAsset != nil) { 
     mediaCell.detailTextLabel.text = previousSoundAsset; 
    } else { 
     mediaCell.detailTextLabel.text = @" "; 
    } 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if([cell.reuseIdentifier isEqualToString:@"mediaCell"]) { 
     UIAlertController *selectTypeAlertController = [UIAlertController alertControllerWithTitle:@"Select Media From" message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 
     //Creating actions 
     UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]; 
     UIAlertAction *selectFromMusicAction = [UIAlertAction actionWithTitle:@"Music" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ 
      [self launchMediaPickerController]; 
     }]; 
     UIAlertAction *selectFromToneAction = [UIAlertAction actionWithTitle:@"Tone" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ 
      [self launchTonePickerController]; 
     }]; 
     //adding them to uialertcontroller; 
     [selectTypeAlertController addAction:cancelAction]; 
     [selectTypeAlertController addAction:selectFromMusicAction]; 
     [selectTypeAlertController addAction:selectFromToneAction]; 
     [self presentViewController:selectTypeAlertController animated:true completion:nil]; 

    } 
} 
- (void)launchTonePickerController { 
    ToneTableViewController *toneVC = [[ToneTableViewController alloc] init]; 
    toneVC.alarmDelegate = alarmDelegate; 
    [self.navigationController pushViewController:toneVC animated:true]; 

} 
- (void)launchMediaPickerController { 
    NSLog(@"Launching MPMediaPickerController"); 
    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic]; 
    mediaPicker.delegate = self; 
    mediaPicker.allowsPickingMultipleItems = NO; 

    [self presentViewController:mediaPicker animated:true completion:nil]; 
} 

//MPMediaPickerDelegate methods 
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker { 
    [self dismissViewControllerAnimated:true completion:^ { 
     NSLog(@"MPMediaPickerController dismissed"); 
    }]; 
} 
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection { 
    MPMediaItem *selectedTrack = [[mediaItemCollection items] objectAtIndex:0]; 
    alarmDelegate.soundAsset = selectedTrack.title; 
    mediaCell.detailTextLabel.text = alarmDelegate.soundAsset; 
    alarmDelegate.appTones = [[NSNumber alloc] initWithBool:NO]; 
    [self dismissViewControllerAnimated:true completion:^ { 
     NSLog(@"MPMediaPickerController dismissed with %@", alarmDelegate.soundAsset); 
     dispatch_async(dispatch_get_main_queue(),^{ 
      [self.tableView reloadData]; 
     }); 
    }]; 
} 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([segue.identifier isEqualToString:@"repeatSegue"]) { 
     DayTableViewController *daysViewController = segue.destinationViewController; 
     daysViewController.alarmDelegate = alarmDelegate; 
     if(previousRepeatArray != nil) { 
      daysViewController.previousSelection = previousRepeatArray; 
     } 
    } 
    else if([segue.identifier isEqualToString:@"labelSegue"]) { 
     LabelViewController *labelViewController = segue.destinationViewController; 
     labelViewController.alarmDelegate = alarmDelegate; 
     if(previousLabel != nil) { 
      labelViewController.previousLabel = previousLabel; 
     } 
    } 
} 
@end 
+0

Sind Sie sicher, dass die Steckdose nicht gleich Null ist? – Brandon

+0

Ja, es ist nicht nil, ich habe es einfach überprüft. – xinkecf35

Antwort

0

Okay, wie von Apples Dokumentation vorgeschlagen, wenn Sie mit Storyboards und statischen Tabellenansichten arbeiten, empfiehlt es sich, einfach eine IBOutlet auf das Element in Frage anhängen und die IBOutlet verwenden, um direkt Eigenschaften auf der genannten Einstellung Element, in diesem Fall das detailTextLabel. Ich weiß immer noch nicht, warum ich das detailTextLabel nicht direkt durch die Zelle ändern konnte, die mir in didSelectRow UITableViewDelegate zurückgegeben wurde, aber da gehts los.

Ich vermute, ich habe nicht versucht, dies zuvor auszuführen, wenn ich in einem GCD-Block auf dem Haupt-Thread versuchte, so dass auch dort. Seien Sie gewarnt, dass es eine wahrnehmbare Verzögerung für die tatsächliche Verzögerung gibt, also seien Sie sich dessen auch bewusst.

0

Bitte überprüfen Sie den Wert von previousSoundAsset. Es kann eine leere Zeichenfolge (nicht NULL) sein.

if(previousSoundAsset != nil || ![previousSoundAsset isEquals:@""]) { 
    mediaCell.detailTextLabel.text = previousSoundAsset; 
} else { 
    mediaCell.detailTextLabel.text = @" "; 
} 
+0

Es ist jedoch nicht, wie ich oben sagte, ich kann deutlich sehen, dass Wert gespart wird. Es wird den aktualisierten Wert anzeigen, wenn ich es speichere und zurück gehe, um es zu bearbeiten. – xinkecf35

+0

Sie können das Protokoll vor dem obigen Code drucken: NSLog (@ "previousSoundAsset =% @", previousSoundAsset); – Kevin

+0

Ich sage, es ist nicht null oder leer. – xinkecf35

Verwandte Themen