2017-12-26 33 views
0

내 앱의 알람 기능에 대한 설정/옵션보기로 정적 테이블보기를 사용하려고했습니다. 여러 가지 ViewControllers를 앞뒤로 데이터를 전달하고 업데이트하고 값을 업데이트 할 수있었습니다.UITableViewCell detailTextLabel이 새 값이 할당 될 때 해당 텍스트를 업데이트하지 않습니다.

MPMediaPickerController는 값을 저장 한 후에도 기꺼이 데이터를 다시 전달하고 대리자를 올바른 값으로 업데이트하지만 alarmObject를 저장하기 전에 detailTextLabel을 업데이트하지 않습니다. ViewController를 닫을 때 객체가 올바른 값으로 저장된다는 것을 로그에서 볼 수 있습니다. 유일한 이상한 점은 해당 VC가 다른 VC의 하위 VC이지만 그 것이 문제라고 생각하지 않습니다.

모든 VC는 MediaPicker를 제외하고는 UINavigationController의 일부이기도합니다.

주 스레드에서 변경 사항을 실행하고 주 스레드가 모든 변경 사항을 실행하도록 지연하고, mediaCell이있는 곳의 특정 행을 다시로드하고, 셀에서 needsDisplay 및 needsLayout 및 layoutIfNeeded를 호출하여 데이터를 다시로드하려고 시도했지만, 아무것도 작동하지 않습니다. 지난 며칠 동안 머리를 맞 and고 좌절감을 나타내 기 때문에 어떤 제안이라도 대단히 환영합니다.

#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

콘센트가 0이 아닌 것은 확실합니까? – Brandon

+0

예 아니요, 그냥 두 번 확인했습니다. – xinkecf35

답변

0

애플의 문서에 의해 제안대로 스토리 보드 및 정적 테이블 뷰와 함께 작업하는 경우 자,,, 단순히 직접 상기의 속성을 설정하는 문제의 항목을 함께 IBOutlet을 연결하고 함께 IBOutlet을 사용하는 것이 좋습니다 항목 (이 경우, detailTextLabel). 나는 왜 didSelectRow UITableViewDelegate에서 나에게 반환되는 셀을 통해 detailTextLabel을 직접 변경할 수 없었는가?

주 스레드에서 GCD 블록을 시도했을 때 이전에이 코드를 실행하지 않은 것으로 의심됩니다. 실제 지연이 발생할 수있는 지각 가능한 지연이 있으므로주의해야합니다.

0

previousSoundAsset의 값을 확인하십시오. 빈 문자열 (nil이 아님) 일 수 있습니다.

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

그러나 위에서 말했듯이 나는 가치가 구원 받고 있음을 분명히 볼 수 있습니다. 그것을 저장할 때 업데이트 된 값을 표시하고 편집하기 위해 되돌아갑니다. – xinkecf35

+0

위의 코드 전에 로그를 인쇄 할 수 있습니다. NSLog (@ "previousSoundAsset = % @", previousSoundAsset); – Kevin

+0

나는 그것이 없거나 비어 있지 않다는 것을 말하고있다. – xinkecf35