在问了一些问题后,我学会了如何从一个 View Controller 向另一个 View Controller 发送命令,并设法编写代码使其正常工作,但没有任何反应......
在我的项目中,我有两个名为 sayfa1
和 sayfa23
的 View Controller 。当点击 sayfa1
上的按钮时,它将打开 sayfa23
并在标签上写字(你好,请参见下面的代码),但它没有发生。在模拟器上,该按钮仅打开 sayfa23
并且标签没有任何反应。如果你看代码你会更好地理解它。
sayfa1.h
#import <UIKit/UIKit.h>
@protocol sayfa1Delegate <NSObject>
- (void)dealWithButton1;
@end
@interface sayfa1 : UIViewController
@property(nonatomic,assign) id<sayfa1Delegate> delegate;
@end
sayfa1.m
#import "sayfa1.h"
@interface sayfa1 ()
@end
@implementation sayfa1
@synthesize delegate;
-(IBAction)button
{
[delegate dealWithButton1];
}
@end
sayfa23.h
#import <UIKit/UIKit.h>
#import "sayfa1.h"
@interface sayfa23 : UIViewController <sayfa1Delegate>
{
IBOutlet UILabel *label;
sayfa1 *vc1 ;
}
@end
sayfa23.m
#import "sayfa23.h"
#import "sayfa1.h"
@interface sayfa23 ()
@end
@implementation sayfa23
- (void)dealWithButton1
{
vc1.delegate = self;
int random_num;
random_num = (arc4random() % 5 - 1) + 1;
if (random_num == 1)
{
label.text = @"hello1";
}
else if (random_num == 2)
label.text = @"hello2";
else if (random_num == 3)
label.text = @"hello3";
else if (random_num == 4)
label.text = @"hello4";
}
@end
编写此代码后,我将按钮连接到 sayfa23
,因此它会打开新页面,我也将该按钮连接到 sayfa1
以接收按钮操作并连接标签(在 sayfa23
) 到 sayfa23
接收标签订单。但正如我所说的,没有发生任何错误,也没有你好,我做错了什么?我在我的一些 h 文件的顶部导入了 sayfa1.h
或 sayfa23.h
导致 Xcode 给我一个关于未定义并解决该问题的错误,但这是我的错误吗或者别的什么。
我想要的例子。
用户打开应用
sayfa1
显示在屏幕上
用户点击按钮,sayfa23
显示 sayfa23
上的标签文本由 sayfa1
处的按钮更改随便写 hello1..2..3 等...
我做错了什么?
重读你的问题,你问你的第一个 View Controller 如何打开第二个 View Controller 并设置一个文本框。如果那确实是您要尝试做的事情,那将是一个简单得多的问题,根本不需要委托(delegate)协议(protocol)或委托(delegate)。
之前的两个答案是通过代表的讨论得出的,但这是为了解决不同的问题。仅当您需要第二个 Controller 将某些内容传递回第一个 Controller 时,才需要委托(delegate)。但是如果你只是想让你的第二个 Controller 从第一个 Controller 接收一些东西,它很简单:
// FirstViewController.h
#import <UIKit/UIKit.h>
@interface FirstViewController : UIViewController
@end
实现如下:
// FirstViewController.m
#import "FirstViewController.h"
#import "SecondViewController.h"
@implementation FirstViewController
- (NSString *)generateRandomText
{
NSString *result;
int random_num;
random_num = (arc4random() % 5 - 1) + 1;
if (random_num == 1)
result = @"hello1";
else if (random_num == 2)
result = @"hello2";
else if (random_num == 3)
result = @"hello3";
else if (random_num == 4)
result = @"hello4";
return result;
}
// if you're using NIBs, it might be something like...
// you only need this method if you're using NIBs and you've manually hooked a button up to this
// if you're using segues, get rid of `goToNextViewController` and just use the following `prepareForSegue
- (IBAction)goToNextViewControllerid)sender
{
SecondViewController *secondController = [[SecondViewController alloc] initWithNibName"SecondView" bundle:nil];
secondController.textFromParent = [self generateRandomText];
[self.navigationController pushViewController:secondController animated:YES];
}
// if you're using segues, give your segue an identifier, e.g. toSecondViewSegue, in Interface Builder and reference the exact same identifier here
// if you're not using segues, you don't need this prepareForSegue method
- (void)prepareForSegueUIStoryboardSegue *)segue senderid)sender
{
if ([segue.identifier isEqualToString"toSecondViewSegue"])
{
SecondViewController *destinationController = segue.destinationViewController;
destinationController.textFromParent = [self generateRandomText];
}
}
@end
您的第二个 Controller 可能如下所示:
// SecondViewController.h
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
@property (strong, nonatomic) NSString *textFromParent;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
使用如下实现:
// SecondViewController.m
#import "SecondViewController.h"
@implementation SecondViewController
@synthesize textFromParent = _textFromParent;
@synthesize label = _label;
- (void)viewDidLoad
{
[super viewDidLoad];
self.label.text = self.textFromParent;
}
@end
关于ios - 使用委托(delegate)在 View Controller 之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11632043/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |