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

Dav*_*ave 9 uiview uiresponder ios swift ios8

我正在尝试按照本指南,但使用swift: InputAccessoryView停靠在底部

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

此只读属性的值为nil.如果要将自定义控件附加到系统提供的输入视图(例如系统键盘)或自定义输入视图(您在inputView属性中提供的视图),请在UIResponder子类中将此属性重新声明为read-write.然后,您可以使用此属性来管理自定义附件视图.当接收器成为第一响应者时,响应者基础结构在显示它之前将附件视图附加到适当的输入视图.

我无法弄清楚如何使用swift来做到这一点.任何帮助是极大的赞赏.

Chr*_*rch 1

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

我不确定如何单独使用swift来实现这一点,但在 Objective C 中做“脏活”并在 Swift 中利用结果很容易

过程

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

  1. 添加一个目标C类,将以下代码复制并粘贴到两个新文件(.h,.m)中
  2. 添加桥接标头并将指定的导入复制并粘贴到其中
  3. 此时,您可以从此 Objective c 类扩展任何 swift 类,而不是 UIView,等等,您可以更改 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
Run Code Online (Sandbox Code Playgroud)

.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
Run Code Online (Sandbox Code Playgroud)

桥接标头

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

#import "YourBaseView.h"
Run Code Online (Sandbox Code Playgroud)

斯威夫特演示

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
Run Code Online (Sandbox Code Playgroud)