gpt4 book ai didi

ios - 协议(protocol)/委托(delegate)不起作用

转载 作者:行者123 更新时间:2023-12-01 18:06:12 25 4
gpt4 key购买 nike

我有三个UIViewcontroller,分别是ViewController、BViewController和CViewController,ViewController是来自UINavigationController的RootViewController,

我通过按钮操作从 ViewController -> BViewController -> CViewController 推送。

我已经在 CViewController 中声明了协议(protocol)。此协议(protocol)方法适用于 BViewController,但我不明白如何在 ViewController 中使用其委托(delegate)方法。

我在 View Controller 中创建了一个 CViewController 对象,然后为该委托(delegate)声明了 self ,尽管它不起作用,下面是我的代码。请帮我。我在这里做错了!

我的 Root View Controller ,即 ViewController

#import "ViewController.h"
#import "BViewController.h"
#import "CViewController.h"

@interface ViewController ()<testDelegates>

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

CViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CViewController"];
cVC.mydelegate = self;
}

- (IBAction)nextAction:(id)sender {

BViewController *bViewC = [self.storyboard instantiateViewControllerWithIdentifier:@"BViewController"];

[self.navigationController pushViewController:bViewC animated:YES];
}

-(void)TestMethod{

NSLog(@" Its NOT Working");
}

我的第二个 View Controller ,即 BViewController
#import "BViewController.h"
#import "CViewController.h"

@interface BViewController ()<testDelegates>

@end

@implementation BViewController

- (void)viewDidLoad {
[super viewDidLoad];
}

- (IBAction)bNextAction:(id)sender {

CViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CViewController"];

// cVC.mydelegate = self;
[self.navigationController pushViewController:cVC animated:YES];
}

-(void)TestMethod{

NSLog(@" Its Working If I uncomment to cVC.mydelegate = self");
}

还有我的第三个 View Controller ,我在 .h 文件中声明了一个协议(protocol),即 CViewController
#import <UIKit/UIKit.h>

@protocol testDelegates <NSObject>

-(void)TestMethod;

@end

@interface CViewController : UIViewController

@property (weak) id <testDelegates> mydelegate;

@end

在 .m 文件中
#import "CViewController.h"

@interface CViewController ()

@end

@implementation CViewController

- (void)viewDidLoad {
[super viewDidLoad];
}

- (IBAction)cNextAction:(id)sender {

[self.mydelegate TestMethod];
}

最佳答案

离开 viewDidLoad 方法后,您创建类和销毁此类。

- (void)viewDidLoad {
[super viewDidLoad];

CViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CViewController"];
cVC.mydelegate = self;
}

据我了解,您需要从 CViewController 在 ViewController 中执行一些方法。

您可以将 viewController 作为委托(delegate)从 BViewController 传递,然后将其传递给 CViewController。

或者你可以使用这样的代码:
- (IBAction)cNextAction:(id)sender {
id< testDelegates > delegate = self.navigationController.viewControllers[0];
if([delegate conformsToProtocol:@protocol(testDelegates)])
{
[delegate TestMethod];
}
}

这不是最好的方法,但它会起作用。

关于ios - 协议(protocol)/委托(delegate)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43541141/

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