Как передать объект на увольнение модального вида - PullRequest
2 голосов
/ 01 ноября 2011

Я представляю VC модально, затем я отклоняю его, когда ячейка выбрана вместе с вызовом метода из исходного VC.

Проблема в том, что nav и routineTableViewController NSLog равны нулю. Как я представляю модель ВК:

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.

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]);
        }
    }];   
}

1 Ответ

2 голосов
/ 01 ноября 2011

См. Мой ответ здесь: Как сохранить обязательный раздел подпредставления в основное представление, основанное на выборе ячеек таблицы

Идеальным решением является создание протокола и с использованием делегата для передачи информации в иерархии контроллера представления. Это позволяет избежать сильной связи, которая происходит в вашем примере, когда вы возвращаетесь к 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>

Внутри RoutineDayTableViewController.m при выделении MusclesTableViewController экземпляра:

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 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 - Знакомство с интерфейсом Builder Storyboarding

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...