所以我正试图让代理人使用,我到目前为止已经看过一些关于如何使用它们的教程。我仍然发现它们令人困惑,在尝试自己实施之后,遇到一个我似乎无法解决的问题。
我有两个ViewControllers,第一个ViewController
包含UITextField *sampleTextField
和一个方法switchViews
的按钮。它还包含方法sendTextToViewController
的协议声明。 SwitchViews
也链接到切换到SecondViewController
的segue。在SecondViewController
中,唯一的对象是UILabel *outputLabel
当用户点击按钮时,它会调用switchViews
并且视图更改为SecondViewController,并且在加载outputLabel
时应该更改为文本已在sampleTextField
的{{1}}中输入。但是,永远不会调用委托方法ViewController
。所有对象都在Interface Builder中创建。
以下代码使其更容易理解:
ViewController.h
sendTextToViewController
然后在 ViewController.m
中声明了这一点#import <UIKit/UIKit.h>
@protocol TextDelegate <NSObject>
-(void)sendTextToViewController:(NSString *)stringText;
@end
@interface ViewController : UIViewController
- (IBAction)switchViews:(id)sender;
@property (weak, nonatomic) IBOutlet UITextField *sampleTextField;
@property (weak, nonatomic) id<TextDelegate>delegate;
@end
SecondViewController.h
- (IBAction)switchViews:(id)sender {
NSLog(@"%@", self.sampleTextField.text);
[self.delegate sendTextToViewController:self.sampleTextField.text];
}
SecondViewController.m
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface SecondViewController : UIViewController <TextDelegate>
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
@end
I've looked at this并且第一个答案是有道理的,但由于某种原因,它不起作用。
我认为问题出在我设置调用#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
@synthesize outputLabel;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
ViewController *vc = [[ViewController alloc]init];
[vc setDelegate:self];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)sendTextToViewController:(NSString *)stringText
{
NSLog(@"Sent text to vc");
[outputLabel setText:stringText];
}
的地方,但不知道如何解决这个问题。一些正确方向的指针将非常感激。请记住,我是obj-c的新手,所以如果你能解释你在说什么,那就太棒了。谢谢。
答案 0 :(得分:0)
您正在创建ViewController
的新实例,但您不会对其执行任何操作。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
ViewController *vc = [[ViewController alloc]init];
[vc setDelegate:self];
}
SecondViewController
需要引用FirstViewController
才能将自己设置为委托。
答案 1 :(得分:0)
首先,您不必使用委托来执行此类程序。 一种更简单的方法是在SecondViewController中创建一个属性,您可以将textField的内容传递给它。
您的代码无效,因为您在尚未设置的委托上调用了sendTextToViewController。您已将委托设置为ViewController的新实例,而不是屏幕上显示的实例。