如何在模态视图的解散上传递对象 [英] How to pass object on modal view's dismissal
问题描述
我现在的问题是,当我选择一个单元格时, 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屋!