【问题标题】:How do I redeclare a property as read-write in UIResponder subclass with swift?如何使用 swift 在 UIResponder 子类中将属性重新声明为读写?
【发布时间】:2014-11-10 10:08:20
【问题描述】:
我正在尝试遵循本指南,但使用 swift:
InputAccessoryView docked at bottom
我似乎无法为我的 ViewController 设置 inputAccessoryView,根据文档,我需要重新声明它:
这个只读属性的值为 nil。如果你想附上
自定义控件到系统提供的输入视图(例如系统
键盘)或自定义输入视图(您在 inputView 中提供的)
属性),在 UIResponder 中将此属性重新声明为可读写
子类。然后,您可以使用此属性来管理自定义附件
看法。当接收者成为第一响应者时,响应者
基础设施将附件视图附加到适当的输入
在显示之前查看。
我不知道如何使用 swift 执行此操作。非常感谢任何帮助。
【问题讨论】:
标签:
ios
swift
uiview
ios8
uiresponder
【解决方案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
}
}
无论如何,我认为这没有任何区别。