gpt4 book ai didi

ios - 使用委托(delegate)在 View Controller 之间进行通信

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:14:33 24 4
gpt4 key购买 nike

问了一些问题后,我学会了如何将命令从一个 View Controller 发送到另一个 View Controller ,并设法编写了可以正常工作的代码,但没有任何反应......

在我的项目中,我有两个名为 sayfa1sayfa23 的 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.hsayfa23.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)goToNextViewController:(id)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)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com