我正在以模态方式呈现VC,然后在选择单元格时调用它,同时调用原始VC中的方法。
现在的问题是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 - >呈现Modally 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]);
}
}];
}
答案 0 :(得分:2)
请在此处查看我的回复:How to save nsdictionary of a subview to a mainview based off tableviewcell selection
理想的解决方案是创建协议,使用委托在视图控制器层次结构中向后传递信息。这可以避免链接回self.parentViewController.navigationController
时示例中发生的紧密耦合。如果父视图控制器将来发生更改或您想要在应用程序的其他位置重新使用选择控制器,会发生什么?作为父项的新视图控制器可以是RoutineDayTableViewController
以外的类的实例,并且可能没有exerciseURL
属性。
对于这个具体的例子,我会做类似以下的事情:
在 SpecificExerciseTableViewController.h
中添加协议定义@class SpecificExerciseTableViewController;
@protocol SpecificExerciseTableViewControllerDelegate <NSObject>
@optional
- (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL;
@end
在 MuscleTableViewController.h
中添加一个属性@property (nonatomic, weak) id delegate;
在 SpecificExerciseTableViewController.h
中添加一个属性@property (nonatomic, weak) id<SpecificExerciseTableViewControllerDelegate> delegate;
在 RoutineDayTableViewController.h
中#import "SpecificExerciseTableViewController.h"
@interface RoutineDayTableViewController <SpecificExerciseTableViewControllerDelegate>
分配MusclesTableViewController
实例时,在 RoutineDayTableViewController.m 内:
MuscleTableViewController *muscleTableViewController = [[MuscleTableViewController alloc] init];
muscleTableViewController.delegate = self;
分配SpecificExerciseTableViewController
个实例时,在 MuscleTableViewController.m 内:
SpecificExerciseTableViewController *specificExerciseTableViewController = [[SpecificExerciseTableViewController alloc] init];
specificExerciseTableViewController.delegate = self.delegate;
在 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];
}
}
最后,在 RoutineDayTableViewController.m
中- (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL;
{
[self addExercise];
}
有关视频中实际操作的示例,请参阅:
00:30:00 WWDC 2011 Video - Introducing Interface Builder Storyboarding
中的最小分数