2012-12-19 2 views
4

У меня есть эта раскадровка: enter image description hereпередать данные parentViewController [IOS]

При нажатии на кнопку «Insegnante» в первом контроллере представления (которым называется newCourseViewController) это показать мне вид таблицы с список преподавателей. Когда я нажимаю на учителя (и вызывается метод tableView:canEditRowAtIndexPath:), я хочу, чтобы UITableViewController «прошел» объект, нажатый на первый контроллер представления.

Это мой код для первого контроллера представления newCourseViewController.h

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

@interface newCourseViewController : UIViewController 

@property (nonatomic , strong) Teacher *teacher; 

@end 

И это мой код для первого контроллера представления newCourseViewController.m (только важный код)

#import "newCourseViewController.h" 
#import "Courses.h" 
#import "Teacher.h" 
#import "addTeacherToCourseViewController.h" 

@interface newCourseViewController() 
@property (weak, nonatomic) IBOutlet UITextField *textField; 
@end 

@implementation newCourseViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

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

-(void)setTeacher:(Teacher *)teacher 
{ 
    self.teacher = teacher; 
    NSLog(@"Maestro settato!"); 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"addTeacherToCourse"]) { 
     [segue.destinationViewController setPreviousViewController:self]; 
    } 
} 

Теперь код для второго контроллера вида addTeacherToCourseViewController-h

@interface addTeacherToCourseViewController : UITableViewController 

@property (nonatomic , weak) id previousViewController; 

@end 

и addTeacherToCourseViewController.m (только важный метод)

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Teacher *teacher = [self.teachers getTeacherInPosition:indexPath.row]; 
    [self.previousViewController setTeacher:teacher]; 
    [self.navigationController popViewControllerAnimated:YES]; 

} 

В первом контроллере представления в методе prepareForSegue я поставил себя в previousViewController во втором представлении. Затем я «пропускаю» выбранного учителя и отклоняю второй контроллер представления. Когда приложение выполнит крах Xcode и сбой симулятора. Я не могу понять, в чем проблема. Вы можете мне помочь?

+0

У вас есть что-нибудь особенное в viewWillAppear на новом контроллере курса? – Leonardo

+0

Нет, ничего, но я решил проблему с делегацией. Был ответ на мой вопрос ниже (и я собирался голосовать как правильный ответ), но пользователь удалил (не знаю, почему, поскольку это был правильный ответ). Если вы возобновите спрос, выбор будет выбран как правильный, иначе я напишу решение. –

ответ

5

Для отправки значений родительскому контроллеру необходимо использовать протоколы. Я предоставлю надлежащие шаги, которые вы должны предпринять, чтобы работать с вашими желаемыми функциями.

1. Создайте протокол для вашего AddTeacherToCourseController. В ваших AddTeacherToCourseController.h добавить следующее право ниже импорта:

@protocol AddTeacherToCourseControllerProtocol <NSObject> 
    - (void)yourDelegateMethod:(Teacher *)insegnante; 
@end 

И ниже интерфейс тега добавить:

@property (strong, nonatomic) id <AddTeacherToCourseControllerProtocol> delegate; 

2. В AddTeacherToCourseController.m:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // I would use the existing array you are using to display the teachers in order to select the correct one you want to send back like this: 
    // Teacher *teacher = [self.teachers getTeacherInPosition:indexPath.row]; 
    [self.delegate yourDelegateMethod:[yourTeacherArray objectAtIndex:indexPath.row]]; 
} 

[ этот метод вызовет ваш метод делегирования через протокол и передаст выбранный профессор в родительский контроллер]

3. В вашем родительском контроллере, ваш newCourseViewController.h сразу после линии интерфейса добавить:

<AddTeacherToCourseControllerProtocol> 

4. Если вы не имеете кнопку действия Insegnante, создать в интерфейсе строителя [перетаскивания именование].Затем добавить следующее к этому действию:

// assuming your storyboard is named MainStoryboard. here you create your segue programmatically: 
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
addTeacherToCourseViewController *addTeacherController = (addTeacherToCourseViewController *)[storyBoard instantiateViewControllerWithIdentifier:@"addTeacherToCourseViewController"]; 
addTeacherController.delegate = self; 
[self.navigationController pushViewController:addTeacherController animated:YES]; 

5. В Interface Builder:

  • Удалите SEGUE от кнопки Insegnante.
  • Редактирование Раскадровка Идентификатор «addTeacherToCourseViewController» к «» addTeacherToCourseViewController

6. В newCourseViewController.h написать свой метод делегата:

- (void)yourDelegateMethod:(Teacher *)insegnante{ 
    // Do whatever you want with your Insegnante 
    // and be sure to pop the second controller from the view stack: 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

Позвольте мне знать, если у вас есть вопросы, и если мой ответ помог всем.

Смежные вопросы