“textFieldDidBeginEditing”几乎匹配 Swift 中协议“UITextFieldDelegate”的可选要求“textFieldDidBeginEditing”

问题描述 投票:0回答:5

我正在开发一个应用程序,我为该应用程序的每个功能创建了模块。我必须从一个模块 UI 控制器切换到另一个模块 UI 控制器。

我在模块中有 UIController,我将该控制器标记为 Public 访问标识符,如下所示

public class InterAccountTransferViewController: UIViewController {
   override public func viewDidLoad() {
    ......
    ......
   }
}

上面的类还在扩展中实现了 UITextField 委托。当我将上述类创建为开放访问时,我收到有关 TextField 委托的警告,如下所示

实例方法“textFieldDidBeginEditing”几乎匹配可选 协议要求“textFieldDidBeginEditing” 'UITextFieldDelegate'

现在文本字段代表不会被调用。当我尝试通过将代表设置为私有来关闭警告时,他们仍然没有被呼叫。

请让我知道如何消除这些警告并致电代表。

任何想法或建议都很棒。我正在 Xcode 10 和 swift 4.2 上工作。如果我需要进一步解释我的问题,请告诉我。

ios swift delegates compiler-warnings access-modifiers
5个回答
16
投票

通过“几乎匹配”,编译器会告诉您两件事:

  1. 不匹配:方法“textFieldDidBeginEditing(_:)”与委托方法“textFieldDidBeginEditing(_:)”不同。对于编译器来说这本身不是问题,你只是有一个具有某个名称的方法,并且它不知道该名称,所以没关系。
  2. 非常像委托方法“textFieldDidBeginEditing(_:)”。因此编译器可以看到您可能打算将其作为委托方法,并且它告诉您,它不起作用。你写的不是委托方法。

编译器告诉您存在问题,这很好。这不太好,因为它没有解释问题到底是什么。

问题是你的类比委托方法具有更多的可见性。你的类是

public
,而你的委托方法只是
internal
(因为
internal
是默认的,如果你没有访问权限)声明中的说明符。)

修复方法是为委托方法提供一个

public
访问说明符。

你必须改变

func textFieldDidBeginEditing(_ textField: UITextField) {
    // ...
}

public func textFieldDidBeginEditing(_ textField: UITextField) {
    // ...
}

这会让编译器知道该方法确实是一个委托方法。


奖励内容...

我如何找到解决方案?我在 Xcode 中重现了该问题。我单击了警告并阅读了修复程序:“使‘textFieldDidBeginEditing’非公开以消除此警告”。我单击“修复”,该行更改为“private func textFieldDidBeginEditing(_ textField: UITextField)”。所以我想也许把它变成

public
而不是
private
会更有帮助。我尝试了一下,检查了一下,它成功了。

为什么 Swift 甚至这样做? 我不确定,但我的猜测是:如果一个类是公共的,但协议方法是内部的,则意味着当您查看时,单个视图控制器对象实现了该协议从模块的角度来看。但由于协议实现是内部的,从外部模块的角度来看,协议方法将不可用,例如来自 UIKit。但这在 Objective C 运行时中是不可能的,即使可能,也会很糟糕。默默地将协议方法公开或半公开是可能的,但不是很干净:例如可以将 textFieldDidBeginEditing 设为内部,但是当您将对象转换为 UITextFieldDelegate 伪对象时,您可以突然调用该方法,这也会令人惊讶。


2
投票

试试这个

class InterAccountTransferViewController: UIViewController,UITextFieldDelegate {
 override func viewDidLoad() {
    super.viewDidLoad()
    //Attach delegates 
    self.textfield.delegate = self
 }
   //TextField Delegate Method
   public func textFieldDidBeginEditing(_ textField: UITextField) {
   }
} 

1
投票

将您的方法也标记为

public

public func textFieldDidBeginEditing(_ textField: UITextField)

0
投票

只需在您的函数中添加

public
访问修饰符即可。

public func textFieldDidBeginEditing(_ textField: UITextField) {
     // do whatever you want
}

0
投票

您还可以查看该函数是否已存在于您的 Viewcontroller 中。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.