繁体   English   中英

在表视图控制器之间传递数据时不调用委托

[英]Delegate not being called when passing back data between Table View Controllers

我正在尝试为使用表视图控制器将数据传递回的应用程序创建一个设置页面,从而根据第二个表视图控制器的选定行的文本更改第一个视图控制器的详细文本标签。 我将NSLog放在初始Table View Controller的委托方法下,但未​​被调用。 我非常困,非常感谢您的帮助!

初始VC .h:

//  EditAlarmTVC.h (Initial table view controller .h file)
//

#import <UIKit/UIKit.h>
#import "AlarmSoundTVC.h"

@interface EditAlarmTVC : UITableViewController <AlarmSoundDelegate>

@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;
@property (weak, nonatomic) IBOutlet UITableViewCell *offMethodCell;
@property (weak, nonatomic) IBOutlet UITableViewCell *repeateCell;
@property (weak, nonatomic) IBOutlet UITableViewCell *alarmLabelCell;
@property (weak, nonatomic) IBOutlet UITableViewCell *alarmSoundCell;
@property (strong) NSManagedObjectModel *alarm;

- (IBAction)cancelSetAlarm:(id)sender;
- (IBAction)saveSetAlarm:(id)sender;

@end

初始VC .m:

//EditAlarmTVC.m (Initial table view controller.m file)

#import "EditAlarmTVC.h"
#import <CoreData/CoreData.h>

@interface EditAlarmTVC ()

@property (weak, nonatomic) IBOutlet UITableView *myTableView;
@property (retain, nonatomic) NSMutableArray *detailedTextLabels;

@end

@implementation EditAlarmTVC

@synthesize alarm;


- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"offMethod"];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"timePicker"];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"repeateLabelSoundCell"];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"deleteAlarmCell"];
    self.detailedTextLabels =[NSMutableArray array];
    [self.detailedTextLabels addObject:@"Off"];
    [self.detailedTextLabels addObject:@"Never"];
    [self.detailedTextLabels addObject:@"Wake up, get up!"];
    [self.detailedTextLabels addObject:@"Default"];

}
-(void) viewWillAppear:(BOOL)animated{
    [self.offMethodCell.detailTextLabel setText:[self.detailedTextLabels objectAtIndex:0]];
    [self.repeateCell.detailTextLabel setText:[self.detailedTextLabels objectAtIndex:1]];
    [self.alarmLabelCell.detailTextLabel setText:[self.detailedTextLabels objectAtIndex:2]];
    [self.alarmSoundCell.detailTextLabel setText:[self.detailedTextLabels objectAtIndex:3]]; 
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)sendSelection:(NSString *)selectedAlarm{
      NSLog(@"hello"); 
    [self.detailedTextLabels replaceObjectAtIndex:3 withObject:selectedAlarm];
    [self.myTableView reloadData];
}

-(NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context =nil;
    id delegat = [[UIApplication sharedApplication] delegate];
    if ([delegat respondsToSelector:@selector(managedObjectContext)]) {
        context = [delegat managedObjectContext];
    }
    return context;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    if(indexPath.section ==2 & indexPath.row==0){
        [self performSegueWithIdentifier:@"repeateSegue" sender:indexPath];
    } else if (indexPath.section ==2 & indexPath.row==1){
        [self performSegueWithIdentifier:@"alarmLabelSegue" sender:indexPath];
    } else if (indexPath.section ==0 & indexPath.row==0){
        [self performSegueWithIdentifier:@"offMethodSegue" sender:indexPath];
    } else if (indexPath.section ==2 & indexPath.row==2){
        [self performSegueWithIdentifier:@"alarmSoundSegue" sender:indexPath];
    } else if (indexPath.section ==3 & indexPath.row==0){
        //DELETE ALARM
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Alarm" inManagedObjectContext:context];

    NSDateFormatter *timeFormatter = [[NSDateFormatter alloc]init];
    [timeFormatter setDateFormat:@"h:mm"];
    NSDate *timeNSDate = [self.datePicker date];
    NSString *timeString = [timeFormatter stringFromDate:timeNSDate];

    NSDateFormatter *amPmFormatter = [[NSDateFormatter alloc]init];
    [amPmFormatter setDateFormat:@"a"];
    NSDate *amPmNSDate = [self.datePicker date];
    NSString *amPmString = [amPmFormatter stringFromDate:amPmNSDate];



        NSPredicate *p1 = [NSPredicate predicateWithFormat:@"time == %@", timeString];
        NSPredicate *p2 = [NSPredicate predicateWithFormat:@"amPm == %@", amPmString];
        NSPredicate *p3 = [NSPredicate predicateWithFormat:@"offMethod == %@", self.offMethodCell.detailTextLabel.text];
        NSPredicate *p4 = [NSPredicate predicateWithFormat:@"repeate == %@", self.repeateCell.detailTextLabel.text];
        NSPredicate *p5 = [NSPredicate predicateWithFormat:@"alarmSound == %@", self.alarmSoundCell.detailTextLabel.text];

        NSPredicate *p6 = [NSPredicate predicateWithFormat:@"alarmLabel == %@", self.alarmLabelCell.detailTextLabel.text];


        NSPredicate *alarmsPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1, p2, p3, p4, p5, p6]];

        [fetchRequest setEntity:entity];
        [fetchRequest setPredicate:alarmsPredicate];

        NSError *error;
        NSArray *items = [context executeFetchRequest:fetchRequest error:&error];

        for (NSManagedObject *managedObject in items)
        {
            [context deleteObject:managedObject];
        }

    EditAlarmTVC *goToEditAlarmTVC = [self.storyboard instantiateViewControllerWithIdentifier:@"setAlarmVC"];
    [self.navigationController pushViewController:goToEditAlarmTVC animated:YES];
    [self dismissViewControllerAnimated:NO completion:nil];
    } else
        return;
}

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"alarmSoundSegue"])
    {
        AlarmSoundTVC *alarmSoundTVC = [[AlarmSoundTVC alloc]init];
        [alarmSoundTVC setDelegate:self];
    }
}

@end

第二个VC .h:

//AlarmSoundTVC.h (Second table view controller .h file)

#import <UIKit/UIKit.h>

@protocol AlarmSoundDelegate <NSObject>
@required
-(void) sendSelection:(NSString *)selectedAlarm;
@end

@interface AlarmSoundTVC : UITableViewController 
@property (strong, nonatomic) IBOutlet UITableView *myTableView;
@property (nonatomic, weak) id <AlarmSoundDelegate> delegate;

@end

第二个VC .m:

// AlarmSoundTVC.m (Second table view controller .m file)

#import "AlarmSoundTVC.h"
#import "EditAlarmTVC.h"

@interface AlarmSoundTVC ()

@end

@implementation AlarmSoundTVC

- (void)viewDidLoad {
    [super viewDidLoad];
    self.myTableView.delegate = self;
}

-(void) viewWillDisappear:(BOOL)animated{
    NSIndexPath *indexPath = [self.myTableView indexPathForSelectedRow];
    UITableViewCell *selectedCell =[self.myTableView cellForRowAtIndexPath:(indexPath)];
    NSString *selectedAlarm = selectedCell.textLabel.text;
    [self.delegate sendSelection:selectedAlarm] ;

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    return [super tableView:tableView cellForRowAtIndexPath:indexPath];

}


#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
//- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//    }

@end

很抱歉,如果其中有一些多余的代码。 我有点新,要确保我提供了很多信息。 再次感谢!

在您的prepareForSegue您将委托设置在新的AlarmSoundTVC本地实例上,该方法退出后将立即被丢弃。 您需要使用将要呈现的实例,可以通过segue的destinationViewController属性对其进行访问:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"alarmSoundSegue"])
    {
        AlarmSoundTVC *alarmSoundTVC = (AlarmSoundTVC *)segue.destinationViewController;
        [alarmSoundTVC setDelegate:self];
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM