4

我有这个故事板: 在此处输入图像描述

当我在第一个视图控制器(称为newCourseViewController )中按下“Insegnante”按钮时,它会显示一个带有教师列表的表格视图。当我按下老师(并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第二个视图中的。然后我“通过”选择的老师,然后解雇第二个视图控制器。当应用程序执行[self.navigationController popViewControllerAnimated:YES];Xcode 崩溃和模拟器崩溃。我不知道是什么问题。你能帮助我吗?

4

1 回答 1

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. 在界面生成器中:

  • 从 Insegnante 按钮中删除你的 segue。
  • 将“addTeacherToCourseViewController”的 Storyboard Id 编辑为“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];
}

如果您有任何问题,以及我的回答是否对任何人有帮助,请告诉我。

于 2012-12-19T23:38:37.720 回答