Ios 将数据从委托视图发送到委托视图[Objective-C]

Ios 将数据从委托视图发送到委托视图[Objective-C],ios,objective-c,iphone,uiviewcontroller,delegates,Ios,Objective C,Iphone,Uiviewcontroller,Delegates,因此,我试图学习如何将数据从一个视图控制器发送到另一个视图控制器 到目前为止,我的代码获取从一个VC(DelegateVC)输入的数据,并将其显示在另一个VC(ViewController)上的标签中 这里的委托是ViewController,委托是DelegateVC =========================================================================== 主要问题 但是如果我想将标签数据从ViewController传递到Dele

因此,我试图学习如何将数据从一个视图控制器发送到另一个视图控制器

到目前为止,我的代码获取从一个VC(
DelegateVC
)输入的数据,并将其显示在另一个VC(
ViewController
)上的标签中

这里的委托是
ViewController
,委托是
DelegateVC

===========================================================================

主要问题 但是如果我想将标签数据从
ViewController
传递到
DelegateVC
,该怎么办?我怎样才能做到这一点?我尝试设计相同的委托概念,但使用
DelegateVC
作为
ViewController
的委托。不确定这是否是写方法

TL;博士: 在
VC
中,如果我点击
Next View
,我将进入
DelegateVC
并输入“test”,它将在
VC的接收标签中显示为“test”

现在,下次点击
next View
,我希望现有标签的值显示在
DelegateVC
TextField
中。不是空白的
文本字段
,而是值“test”

=========================================================================== 假设我有一个
Main.storyboard
像这样:

我有一个
ViewController.h
文件:

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController


@end
DelegateVC.h:

#import <UIKit/UIKit.h>
@protocol MainVCDelegate;

@interface DelegatedVC : UIViewController
@property (strong, nonatomic) IBOutlet UITextField *sendDataTF;
- (IBAction)sendData:(id)sender;
@property (weak, nonatomic) id<MainVCDelegate> delegate;
@end

@protocol MainVCDelegate <NSObject>
-(void) sendBackData: (DelegatedVC *) delegatedVC : (NSString *) textField;
@end
#import "DelegatedVC.h"
@protocol MainVCDelegate;

@interface DelegatedVC ()

@end

@implementation DelegatedVC

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

- (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)sendData:(id)sender {
    [self.delegate sendBackData: self : _sendDataTF.text];
}
@end
但是如果我想从ViewController传递标签的数据呢 授权VC?我怎样才能做到这一点

因此,正如我在代码中看到的那样,您的委托是正确的。回到您的主要问题,您只需要在
DelegateVC.h
中声明一个公共
NSString
对象,然后访问该对象并将数据从
ViewController
prepareforsgue
传递到该对象

下一步,在
DelegateVC.m
中,获取
NSString
对象的值并将其传递给
UITextField

如果有帮助,请告诉我:)

但是如果我想从ViewController传递标签的数据呢 授权VC?我怎样才能做到这一点

因此,正如我在代码中看到的那样,您的委托是正确的。回到您的主要问题,您只需要在
DelegateVC.h
中声明一个公共
NSString
对象,然后访问该对象并将数据从
ViewController
prepareforsgue
传递到该对象

下一步,在
DelegateVC.m
中,获取
NSString
对象的值并将其传递给
UITextField


让我知道这是否有帮助:)

代理允许一个对象在事件发生时向另一个对象发送消息

如果要将标签数据从
ViewController
传递到
DelegateVC
,则不需要使用delegate。但是,由于在
sendDataTF
textfield上发生更改时,您希望更新
receivingLabel
,因此在这种情况下,您需要一个代理,我认为您已经做得很好了

解决方案:您需要在
DelegateVC
中声明一个属性来存储从
ViewController
传递的字符串,并在
viewDidLoad
上的
sendDataTF
中设置该文本

在DelegateVC.h中声明属性:

#import "ViewController.h"
#import "DelegatedVC.h"

@interface ViewController () <MainVCDelegate>
@property (strong, nonatomic) IBOutlet UILabel *receivingLabel;
- (IBAction)nextView:(id)sender;
@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.
}


- (IBAction)nextView:(id)sender {

}

-(void) sendBackData:(DelegatedVC *)delegatedVC :(NSString *)textField {
    [delegatedVC dismissViewControllerAnimated:YES completion:nil];
    self.receivingLabel.text = textField;
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    DelegatedVC *secondVC = segue.destinationViewController;
    secondVC.delegate = self;
}
@end
@interface DelegatedVC : UIViewController

@property (weak, nonatomic) id<MainVCDelegate> delegate;
@property (strong, nonatomic) NSString *labelString;

@property (strong, nonatomic) IBOutlet UITextField *sendDataTF;

- (IBAction)sendData:(id)sender;

@end
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender           
{
   DelegatedVC *secondVC = segue.destinationViewController;
   secondVC.delegate = self;
   secondVC.labelString = self.receivingLabel.text;
}
- (void)viewDidLoad {
  [super viewDidLoad];
  self.sendDataTF.text = self.labelString;
}
DelegateVC.m:

#import "ViewController.h"
#import "DelegatedVC.h"

@interface ViewController () <MainVCDelegate>
@property (strong, nonatomic) IBOutlet UILabel *receivingLabel;
- (IBAction)nextView:(id)sender;
@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.
}


- (IBAction)nextView:(id)sender {

}

-(void) sendBackData:(DelegatedVC *)delegatedVC :(NSString *)textField {
    [delegatedVC dismissViewControllerAnimated:YES completion:nil];
    self.receivingLabel.text = textField;
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    DelegatedVC *secondVC = segue.destinationViewController;
    secondVC.delegate = self;
}
@end
@interface DelegatedVC : UIViewController

@property (weak, nonatomic) id<MainVCDelegate> delegate;
@property (strong, nonatomic) NSString *labelString;

@property (strong, nonatomic) IBOutlet UITextField *sendDataTF;

- (IBAction)sendData:(id)sender;

@end
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender           
{
   DelegatedVC *secondVC = segue.destinationViewController;
   secondVC.delegate = self;
   secondVC.labelString = self.receivingLabel.text;
}
- (void)viewDidLoad {
  [super viewDidLoad];
  self.sendDataTF.text = self.labelString;
}

希望它能工作。

委托允许一个对象在事件发生时向另一个对象发送消息

如果要将标签数据从
ViewController
传递到
DelegateVC
,则不需要使用delegate。但是,由于在
sendDataTF
textfield上发生更改时,您希望更新
receivingLabel
,因此在这种情况下,您需要一个代理,我认为您已经做得很好了

解决方案:您需要在
DelegateVC
中声明一个属性来存储从
ViewController
传递的字符串,并在
viewDidLoad
上的
sendDataTF
中设置该文本

在DelegateVC.h中声明属性:

#import "ViewController.h"
#import "DelegatedVC.h"

@interface ViewController () <MainVCDelegate>
@property (strong, nonatomic) IBOutlet UILabel *receivingLabel;
- (IBAction)nextView:(id)sender;
@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.
}


- (IBAction)nextView:(id)sender {

}

-(void) sendBackData:(DelegatedVC *)delegatedVC :(NSString *)textField {
    [delegatedVC dismissViewControllerAnimated:YES completion:nil];
    self.receivingLabel.text = textField;
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    DelegatedVC *secondVC = segue.destinationViewController;
    secondVC.delegate = self;
}
@end
@interface DelegatedVC : UIViewController

@property (weak, nonatomic) id<MainVCDelegate> delegate;
@property (strong, nonatomic) NSString *labelString;

@property (strong, nonatomic) IBOutlet UITextField *sendDataTF;

- (IBAction)sendData:(id)sender;

@end
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender           
{
   DelegatedVC *secondVC = segue.destinationViewController;
   secondVC.delegate = self;
   secondVC.labelString = self.receivingLabel.text;
}
- (void)viewDidLoad {
  [super viewDidLoad];
  self.sendDataTF.text = self.labelString;
}
DelegateVC.m:

#import "ViewController.h"
#import "DelegatedVC.h"

@interface ViewController () <MainVCDelegate>
@property (strong, nonatomic) IBOutlet UILabel *receivingLabel;
- (IBAction)nextView:(id)sender;
@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.
}


- (IBAction)nextView:(id)sender {

}

-(void) sendBackData:(DelegatedVC *)delegatedVC :(NSString *)textField {
    [delegatedVC dismissViewControllerAnimated:YES completion:nil];
    self.receivingLabel.text = textField;
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    DelegatedVC *secondVC = segue.destinationViewController;
    secondVC.delegate = self;
}
@end
@interface DelegatedVC : UIViewController

@property (weak, nonatomic) id<MainVCDelegate> delegate;
@property (strong, nonatomic) NSString *labelString;

@property (strong, nonatomic) IBOutlet UITextField *sendDataTF;

- (IBAction)sendData:(id)sender;

@end
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender           
{
   DelegatedVC *secondVC = segue.destinationViewController;
   secondVC.delegate = self;
   secondVC.labelString = self.receivingLabel.text;
}
- (void)viewDidLoad {
  [super viewDidLoad];
  self.sendDataTF.text = self.labelString;
}

希望它能工作。

以下是正确的工作代码,您可以查看:

带有标签和按钮的DelegateVc.h文件

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

@interface DelegateVC : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *ReceiveLabel;
@property (weak, nonatomic) IBOutlet UIButton *NextView;
@property (strong, nonatomic) NSString *TextFeildText;
带文本字段的DelagatedVc.h

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

@interface DelegatedVC : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *RCTextField;
@property (weak, nonatomic) IBOutlet UIButton *SenddataBtn;
@property (strong, nonatomic) NSString *LabelText;
@end
我的故事板前景


以下是您可以查看的正确工作代码:

带有标签和按钮的DelegateVc.h文件

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

@interface DelegateVC : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *ReceiveLabel;
@property (weak, nonatomic) IBOutlet UIButton *NextView;
@property (strong, nonatomic) NSString *TextFeildText;
带文本字段的DelagatedVc.h

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

@interface DelegatedVC : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *RCTextField;
@property (weak, nonatomic) IBOutlet UIButton *SenddataBtn;
@property (strong, nonatomic) NSString *LabelText;
@end
我的故事板前景


与其使用一个序列返回到原始视图控制器,不如使用一个展开序列,这样您的视图就不会彼此重叠。与其使用分段返回到原始视图控制器,不如使用展开分段,这样您的视图就不会彼此重叠。我试过了,但没用。我所做的是在
DelegateVC.h
声明的
静态NSString*globalStr
中。在
ViewController
prepareforsgue
中,我添加了
globalStr=\u receivingLabel.text
。最后,在DelegateVC.m的viewdiload中,我添加了sendDataTF.text=globalStr
。思想?谢谢这就是我在上面的回答中告诉你的:)我试过了,但没有成功。我所做的是在
DelegateVC.h
声明的
静态NSString*globalStr
中。在
ViewController
prepareforsgue
中,我添加了
globalStr=\u receivingLabel.text
。最后,在DelegateVC.m的viewdiload中,我添加了sendDataTF.text=globalStr。思想?谢谢这就是我在上面的回答中告诉你的:)