【问题标题】:Setting Up Delegation with Xcode 6 and OBJ C使用 Xcode 6 和 OBJ C 设置委托
【发布时间】:2015-02-23 15:18:55
【问题描述】:

我正式陷入困境。我正在尝试将数据(NSString)从一个视图控制器发送到另一个。我相信我已经正确设置了所有内容,但它不起作用。我制作了一个示例应用程序进行测试。如果有人可以查看并提供建议,我将非常感激。

示例应用有 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

【问题讨论】:

  • self.delegate in closeVC2 没有设置,是吗?
  • @Thorsten:显然不是。这还指出,这里可能会进行大量的零检查。 NSParameterAssert() 很方便...
  • “这不起作用”是什么意思?你有错误吗?
  • 来自 VC2 的数据永远不会到达 VC1。如何设置 self.delegate?也许这就是问题所在。
  • 在你的 VC1 中,在展示 VC2 之前,将 vc2.delegate 设置为 self(这应该是 VC1 实例)。

标签: ios objective-c xcode


【解决方案1】:

感谢大家的 cmets 和帮助。 @Kilogen9 你扰乱了我的记忆,我记得我错过了什么。

我将 VC2 嵌入到导航控制器中。然后在 VC1 中我添加了一个 prepareForSegue,在 segue 之前,我将 VC2.delegate 设置为 self。

我已经有将近一年的时间远离编码,并且已经坐在这里查看我在实际项目中的代码至少一个星期,试图弄清楚我忘记了哪一步。 Stack Overflow 社区再次提供了帮助。

谢谢!

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2021-08-29
    • 1970-01-01
    • 2012-10-11
    • 2014-07-20
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多