如何使用 swift 在 UIResponder 子类中将属性重新声明为读写?

Posted

技术标签:

【中文标题】如何使用 swift 在 UIResponder 子类中将属性重新声明为读写?【英文标题】:How do I redeclare a property as read-write in UIResponder subclass with swift? 【发布时间】:2014-11-10 10:08:20 【问题描述】:

我正在尝试遵循本指南,但使用 swift: InputAccessoryView docked at bottom

我似乎无法为我的 ViewController 设置 inputAccessoryView,根据文档,我需要重新声明它:

这个只读属性的值为 nil。如果你想附上 自定义控件到系统提供的输入视图(例如系统 键盘)或自定义输入视图(您在 inputView 中提供的) 属性),在 UIResponder 中将此属性重新声明为可读写 子类。然后,您可以使用此属性来管理自定义附件 看法。当接收者成为第一响应者时,响应者 基础设施将附件视图附加到适当的输入 在显示之前查看。

我不知道如何使用 swift 执行此操作。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

老问题,但这可能对那些不太熟悉 Objective-C 的人有用。

我不知道如何单独使用 swift 来实现这一点,但在目标 c 中完成“肮脏的工作”并在 swift 中使用结果很容易

流程

这种方法需要将 3 个文件添加到您的项目中。

    添加一个目标C类,将以下代码复制粘贴到 两个新文件(.h、.m) 添加桥接头并将指定的导入复制并粘贴到其中 此时,您可以从此 Objective c 扩展任何 swift 类 类而不是 UIView 和 et voila,您可以更改 inputAccessoryView。

享受

.h 文件

#import <UIKit/UIKit.h>

/**
 * Starting point for subclasses that allow input accessorty view to be changed
 */
@interface YourBaseView : UIView

@property (readwrite,nonatomic) UIView*_Nullable inputAccessoryView;
@end

.m 文件

#import "YourBaseView.h"

@implementation YourBaseView

/*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect 
 // Drawing code
 
 */

@end

桥接头

在“YOUR_PROJECT_NAME-Bridging-Header.h”(或在项目的构建设置中的 Objective-C 桥接头属性中调用的任何内容 (SWIFT_OBJC_BRIDGING_HEADER)

#import "YourBaseView.h"

Swift 演示

class YourSwiftAccessoryInputView : YourBaseView

    //the rest is up to you


let instance = YourSwiftAccessoryInputView(frame: CGRect(x:0, y:0,width:100,height:100))
instance.inputAccessoryView = Some view

【讨论】:

【参考方案2】:

像这样:

private let accessoryView = AccessoryView()
class MessagesViewController : UIViewController 
    override var inputAccessoryView: AccessoryView 
        return accessoryView
    

【讨论】:

【参考方案3】:

试试这个。

private weak var _inputAccessoryViewController: UIInputViewController?
override var inputAccessoryViewController: UIInputViewController? 
    get 
        return _inputAccessoryViewController
    
    set 
        _inputAccessoryViewController = newValue
    

无论如何,我认为这没有任何区别。

【讨论】:

以上是关于如何使用 swift 在 UIResponder 子类中将属性重新声明为读写?的主要内容,如果未能解决你的问题,请参考以下文章

教程类型“NSNotification.Name”没有成员“UIResponder”中的 Swift 5 不起作用

我无法在 Swift iOS 中创建 UIResponder nextResponder

类 AppDelegate: UIResponder, UIApplicationDelegate SWIFT 中的 SIGABIRT 错误

在 Swift 中使用 Parse 登录 Facebook

如何从 UIResponder 中提取更多的接触点?

SWIFT 闭包的简单使用