4

私はこのストーリーボードを持っています: ここに画像の説明を入力

最初のView Controller( newCourseViewControllerと呼ばれる)の「Insegnante」ボタンを押すと、教師のリストを含むテーブルビューが表示されます。教師を押すと(そしてメソッドtableView:canEditRowAtIndexPath:が呼び出されます)UITableViewController、最初のView Controllerに押されたオブジェクトを「渡す」必要があります。

これは、最初のビュー コントローラー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];
    }
}

次に、2 番目のビュー コントローラーのコード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、2 番目のビューの に自分自身を設定しました。次に、選択した教師を「パス」し、2 番目のビュー コントローラーを閉じます。アプリケーションが[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. Interface Builder で:

  • Insegnante ボタンからセグエを削除します。
  • 「addTeacherToCourseViewController」のストーリーボード 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 に答える