如何在模态视图的解散上传递对象 [英] How to pass object on modal view's dismissal

查看:88
本文介绍了如何在模态视图的解散上传递对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

$ p

我现在的问题是,当我选择一个单元格时, nav routineTableViewController NSLog为null。
如何显示模型VC:

  NSString * selectedRow = [[self.exerciseArray objectAtIndex:selectedRowIndex.row] objectForKey:@exerciseName]; 
UINavigationController * nav = self.parentViewController.navigationController;
RoutineDayTableViewController * routineDayTableViewController =(RoutineDayTableViewController *)[nav topViewController];
routineDayTableViewController.muscleURL = self.muscleURL;
[routineDayTableViewController addExercise];
[self.parentViewController dismissModalViewControllerAnimated:YES];

VC的层次结构:RoutineDayTableViewController - >呈现Modly MusclesTableViewController,然后推送到子表视图,到$ RoutineDayTableViewController。



编辑:

   - (void)addExercise 
{
PFObject * exerciseInRoutine = [[PFObject alloc] initWithClassName:@exerciseInRoutine];
[exerciseInRoutine setObject:self.selectedExercise forKey:@name];
[exerciseInRoutine setObject:self.muscleName forKey:@muscle];
[exerciseInRoutine setObject:self.muscleURL forKey:@picture];
[exerciseInRoutine saveInBackgroundWithBlock:^(BOOL succeeded,NSError * error){
if(!error){
[self.tableView reloadData];
} else {
NSLog(@Error:%@%@,error,[error userInfo]);
}
}];
}


解决方案

a href =http://stackoverflow.com/questions/7922305/how-to-save-nsdictionary-of-a-subview-to-a-mainview-based-off-tableviewcell-sele/7948912#7948912>如何根据tableviewcell选择将子视图的nsdictionary保存到mainview



理想的解决方案是创建协议使用委托在视图控制器层次结构中向后传递信息。这避免了您的示例中发生的紧耦合,当您链接回到 self.parentViewController.navigationController 。如果父视图控制器在将来发生更改或者要在应用程序的其他位置重新使用选择控制器,会发生什么?作为父视图的新视图控制器可以是 RoutineDayTableViewController 以外的类的实例,并且可能没有 exerciseURL 属性。



对于此特定示例,我将执行如下操作:



SpecialExerciseTableViewController.h

  @class SpecificExerciseTableViewController; 

@protocol SpecificExerciseTableViewControllerDelegate< NSObject>
@optional
- (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL;
@end

MuscleTableViewController.h / p>

  @property(nonatomic,weak)id delegate; 

SpecificExerciseTableViewController.h 中添加属性

  @property(nonatomic,weak)id< SpecificExerciseTableViewControllerDelegate>代表; 

内部 RoutineDayTableViewController.h

  #importSpecificExerciseTableViewController.h

@interface RoutineDayTableViewController< SpecificExerciseTableViewControllerDelegate>

当分配 MusclesTableViewController时, RoutineDayTableViewController.m instance:

  MuscleTableViewController * muscleTableViewController = [[MuscleTableViewController alloc] init]; 
muscleTableViewController.delegate = self;

内部 MuscleTableViewController.m 分配 SpecificExerciseTableViewController 实例:

  SpecificExerciseTableViewController * specificExerciseTableViewController = [[SpecificExerciseTableViewController alloc] init]; 
specificExerciseTableViewController.delegate = self.delegate;

内部 SpecificExerciseTableViewController.m

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
if([self.delegate responsesToSelector:@选择器(specificExerciseTableViewController:didSelectSpecificExerciseWithURL :)])
{
NSURL * selectedExerciseURL = [[self.exerciseArray objectAtIndex:selectedRowIndex.row] objectForKey:@exerciseName];
[self.delegate specificExerciseTableViewController:self didSelectSpecificExerciseWithURL:selectedExerciseURL];
[self dismissModalViewControllerAnimated:YES];最后,在 RoutineDayTableViewController.m / strong>

   - (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL; 
{
[self addExercise];
}

在视频的实践中,例如:



00:30:00 最小标记 WWDC 2011视频 - 介绍界面生成器故事板


I'm presenting a VC modally, then I dismiss it when a cell is selected along with call a method from the original VC.

The problem now is that nav and routineTableViewController NSLog as null. How I present the model VC:

NSString *selectedRow = [[self.exerciseArray objectAtIndex:selectedRowIndex.row]objectForKey:@"exerciseName"];
UINavigationController *nav = self.parentViewController.navigationController;
RoutineDayTableViewController *routineDayTableViewController = (RoutineDayTableViewController *) [nav topViewController];
routineDayTableViewController.muscleURL = self.muscleURL;
[routineDayTableViewController addExercise];
[self.parentViewController dismissModalViewControllerAnimated:YES];

Hierarchy of VC: RoutineDayTableViewController -> presents Modally MusclesTableViewController, then pushes to child table view, which dismisses back to RoutineDayTableViewController.

Edit:

-(void)addExercise
{       
    PFObject *exerciseInRoutine = [[PFObject alloc] initWithClassName:@"exerciseInRoutine"];
    [exerciseInRoutine setObject:self.selectedExercise forKey:@"name"]; 
    [exerciseInRoutine setObject:self.muscleName forKey:@"muscle"]; 
    [exerciseInRoutine setObject:self.muscleURL forKey:@"picture"]; 
    [exerciseInRoutine saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) {
            [self.tableView reloadData];
        } else {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];   
}

解决方案

See my reply here: How to save nsdictionary of a subview to a mainview based off tableviewcell selection

The ideal solution is to create a protocol and use a delegate to pass information backwards in your view controller hierarchy. This avoids the tight coupling which is happening in your example when you link back to self.parentViewController.navigationController. What happens if the parent view controller changes in the future or you want to resuse the selection controller elsewhere in the app? The new view controller that is the parent could be an instance of a class other than RoutineDayTableViewController and may not have a exerciseURL property.

For this specific example, I would do something like the following:

Add the protocol definition inside SpecificExerciseTableViewController.h

@class SpecificExerciseTableViewController;

@protocol SpecificExerciseTableViewControllerDelegate <NSObject>
@optional
- (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL;
@end

Add a property inside MuscleTableViewController.h

@property (nonatomic, weak) id delegate;

Add a property inside SpecificExerciseTableViewController.h

@property (nonatomic, weak) id<SpecificExerciseTableViewControllerDelegate> delegate;

Inside RoutineDayTableViewController.h

#import "SpecificExerciseTableViewController.h"

@interface RoutineDayTableViewController <SpecificExerciseTableViewControllerDelegate>

Inside RoutineDayTableViewController.m when allocating a MusclesTableViewController instance:

MuscleTableViewController *muscleTableViewController = [[MuscleTableViewController alloc] init];
muscleTableViewController.delegate = self;

Inside MuscleTableViewController.m when allocating a SpecificExerciseTableViewController instance:

SpecificExerciseTableViewController *specificExerciseTableViewController = [[SpecificExerciseTableViewController alloc] init];
specificExerciseTableViewController.delegate = self.delegate;

Inside SpecificExerciseTableViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self.delegate respondsToSelector:@selector(specificExerciseTableViewController:didSelectSpecificExerciseWithURL:)])
    {
        NSURL *selectedExerciseURL = [[self.exerciseArray objectAtIndex:selectedRowIndex.row] objectForKey:@"exerciseName"];
        [self.delegate specificExerciseTableViewController:self didSelectSpecificExerciseWithURL:selectedExerciseURL];
        [self dismissModalViewControllerAnimated:YES];
    }
}

Finally, in your RoutineDayTableViewController.m

- (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL;
{
    [self addExercise];
}

For an example of this in practice in a video see:

00:30:00 min mark in WWDC 2011 Video - Introducing Interface Builder Storyboarding

这篇关于如何在模态视图的解散上传递对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆