2015-02-22 1 views
0

Я официально застрял. Я пытаюсь отправить данные (NSString) с одного контроллера представления на другой. Я считаю, что все правильно установлено, но это не сработает. Я сделал пример приложения для тестирования. Если кто-то может посмотреть и посоветовать, я буду очень благодарен.Настройка делегирования с помощью Xcode 6 и OBJ C

Пример приложения имеет 2 контроллера вида. У VC1 есть простой UITextView. VC2 имеет UITextField. При нажатии кнопки на VC1, VC2 появляется модально. Затем пользователь может вводить данные в VC2, а при нажатии кнопки закрытия данные должны заполнять текстовый вид в VC1. Проблема в том, что это не работает.

Спасибо, что посмотрели.

VC1.h

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

@interface ViewController : UIViewController <ViewController2Delegate> 

@property (weak, nonatomic) IBOutlet UITextView *mainTextView; 

@end 

VC1.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

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

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

- (void)dataForMainViewSet:(ViewController2 *)sender dataToSet:(id)data { 
    self.mainTextView.text = data; 
} 
@end 

VC2.h

#import <UIKit/UIKit.h> 

@class ViewController2; 

@protocol ViewController2Delegate <NSObject> 

@optional 
- (void)dataForMainViewSet:(ViewController2 *)sender dataToSet:(id)data; 
@end 

@interface ViewController2 : UIViewController 
@property (weak, nonatomic) IBOutlet UITextField *textField; 
@property (weak, nonatomic) id <ViewController2Delegate> delegate; 

- (IBAction)closeVC2; 
@end 

VC2.m

#import "ViewController2.h" 
#import "ViewController.h" 

@interface ViewController2() <UITextFieldDelegate> 

@end 

@implementation ViewController2 

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

} 

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

/* 
#pragma mark - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 
} 
*/ 

- (IBAction)closeVC2 { 
    [self.delegate dataForMainViewSet:self 
          dataToSet:self.textField.text]; 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 
@end 
+1

self.delegate in closeVC2 не установлен, не так ли? – Thorsten

+0

@Thorsten: Не очевидно. Что также указывает на то, что здесь может быть целая куча нулевой проверки. NSParameterAssert() удобен ... – stevesliva

+0

Что значит «это не работает»? вы получаете сообщение об ошибке? – MendyK

ответ

0

Чем k вы все для комментариев и помощи. @ Kilogen9, ты испортил мне память, и я вспомнил, что мне не хватало.

Встраиваю VC2 в навигационный контроллер. И затем в VC1 я добавил prepareForSegue и там до начала, я установил VC2.delegate в себя.

Я был вдали от кодирования почти год и сидел здесь, глядя на мой код в своем реальном проекте, по крайней мере, на неделю, пытаясь понять, на каком этапе я забыл. Снова сообщество Stack Overflow помогло.

Спасибо!