【问题标题】:How to use delegate in objective C and swift Viewcontroller如何在目标 C 和 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 中检索委托中的数据。我应该添加什么?

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

【问题讨论】:

    标签: ios objective-c swift appdelegate xcode9.2


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 2012-01-18
      相关资源
      最近更新 更多