如何在目标 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 协议中添加了让我先回答 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 AppDelegate 的参考