如何在目标 C 和 swift Viewcontroller 中使用委托

Posted

技术标签:

【中文标题】如何在目标 C 和 swift Viewcontroller 中使用委托【英文标题】:How to use delegate in objective C and swift Viewcontroller 【发布时间】:2018-04-09 17:01:51 【问题描述】:

我的项目结合了一个用 Objective C (objCViewController) 编写的视图控制器,另一个由 swift (SwiftViewCONtroller) 编写。 我有几个变量 NSString。我想更新 objCViewController 中的字符串并使用委托在 SwiftViewController 中访问它,因为我需要在这两个视图控制器之间不断切换并不断更新字符串。

代码如下:

objCViewController.h

#import <UIKit/UIKit.h>

@protocol MyDelegate <NSObject>
@end

@interface objCViewController : UIViewController
  NSString * stringbeingpassed;


@property (nonatomic, weak) id<MyDelegate> delegate;
@property (nonatomic, retain) NSString * stringbeingpassed;
@end

objCViewController.m

@implementation objCViewController
@synthesize delegate;
@synthesize stringbeingpassed;

- (void)updatestring 
  //update string in this method
  NSString * newstring = @"testing";

  if (delegate != nil && [delegate respondsToSelector:@selector(stringUpdated:)]) 
    [delegate stringUpdated: newstring];

桥接头.h:

#import "objCViewController.h"

SwiftViewController.swift:

protocol MyDelegate 
func stringUpdated(newMessage: String)


import UIKit
@objc class SwiftViewController: UIViewController, MyDelegate
override func viewDidLoad() 
    super.viewDidLoad()


func stringUpdated(newMessage:String) 
let newMessage = "sent string"

我尝试过使用委托,但我不知道如何使用它。我对快速和客观的 C 完全陌生

第一季度。我想问一下如何将我的 newstring 分配给 objCViewController 中的委托,然后将其传递给 SwiftViewController

第二季度。另一个问题是如何在 SwiftViewController 中检索委托中的数据。我应该添加什么?

第三季度。我在定义委托时还遗漏了什么?我需要在两个视图控制器中定义它吗? 谢谢。

【问题讨论】:

【参考方案1】:

由于所提供的信息很少,很难说代表是否适合这项工作。事实上,我可能会建议研究更好的方法来构建您的应用程序。

话虽如此,查看您的协议 MyDelegate 的代码会很有帮助。如果此协议还没有,它将需要一个接受“字符串”作为参数/参数的“函数”。现在让我们将此函数称为 stringUpdated。使用提供的代码,您需要将 SwiftViewController 的实例设置为 objCViewController 中的属性 delegate。这样,当调用 updatestring 时,您可以执行以下操作:

- (void)updatestring 
    //update string in this method
    NSString * newstring = @"testing";

    if (delegate != nil && [delegate respondsToSelector:@selector(stringUpdated:)]) 
        [delegate stringUpdated: newstring]
    

SwiftViewController 中,您必须采用如下协议:

@objc class SwiftViewController: UIViewController, MyDelegate 

然后通过实现函数stringUpdated来遵守协议。

更新

您的协议仍然缺少方法。它应该是这样的:

@protocol MyDelegate
- (void) stringUpdated:(NSString *)updatedString;
@end

【讨论】:

我在 SwiftViewController 中创建了一个 func stringUpdated 下面是代码:protocol MyDelegate func stringUpdated(newMessage: message) func stringUpdated(newMessage:String) newMessage = "sent string" 但在 objCViewController我收到错误:选择器“respondsToSelector:”没有已知的实例方法,选择器“stringUpdated:”没有已知的实例方法 你能用你的协议编辑/更新你的问题吗?听起来该协议是在 swift 中定义的,并且不符合 NSObject 以便使用 Obj-C 问题已更新。我在 Mydelegate 协议中添加了 ,现在我在 objCViewController 中仍然出现错误:选择器'stringUpdated:'没有已知的实例方法 哦,抱歉,我没有在 objCViewController 标头的顶部看到您的协议。您错过了一个非常重要的部分,这就是它返回该错误的实际原因。你从来没有像我上面描述的那样定义协议方法。我在答案中添加了一个示例。 这个if语句是什么意思? if (delegate != nil && [delegate respondsToSelector:@selector(stringUpdated:)]) 。我的代码无法运行到这个 if 语句,我没有在这个 if 语句中执行 printf【参考方案2】:

让我先回答 Q3 Q3:我在定义委托时还有什么遗漏的吗?我需要在两个视图控制器中定义它吗? 不,您不必在两个视图控制器中定义 MyDelegate,只需将其添加到 objCViewControlle

现在在这里我已经修改了你的代码

objCViewController.h

@protocol MyDelegate <NSObject>
- (void) stringUpdated:(NSString *)updatedString;
- (NSString *) getString;
@end

@interface objCViewController : UIViewController
  NSString * stringbeingpassed;


@property (nonatomic, weak) id<MyDelegate> delegate;
@property (nonatomic, retain) NSString * stringbeingpassed;
@end

桥接头.h:

#import "objCViewController.h"

SwiftViewController.swift:

import UIKit
@objc class SwiftViewController: UIViewController, MyDelegate
var thisIsObjectiveVCString:String?
override func viewDidLoad() 
    super.viewDidLoad()


func stringUpdated(newMessage:String) 
thisIsObjectiveVCString = newMessage


func getString() ->String 
return thisIsObjectiveVCString


Q2:如何在 SwiftViewController 中检索委托中的数据。我应该添加什么?

在 objCViewControlle 上

if (delegate != nil && [delegate respondsToSelector:@selector(getString)]) 
        NSString * theString = [delegate getString];
    

Q1:如何将我的 newstring 分配给 objCViewController 中的委托,然后将其传递给 SwiftViewController

实际上在 objCViewController 上,如果您调用 updatestring 那么您将更新 SwiftViewController

【讨论】:

以上是关于如何在目标 C 和 swift Viewcontroller 中使用委托的主要内容,如果未能解决你的问题,请参考以下文章

如何在目标c中使用swift文件

我如何从目标 c 代码中获取 Swift AppDelegate 的参考

如何在目标 c 中引用 swift app 委托

如何在目标 c-swift 桥接项目中使用 intentdefinition 文件?

如何使用通知将字符串数据从 swift 传递到目标 c 类

如何使用来自目标c的同名类而不是swift