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

时间:2014-11-10 10:08:21

标签: ios swift uiview ios8 uiresponder

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

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

  

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

我无法弄清楚如何使用swift来做到这一点。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

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

我不确定如何使用 swift 单独来实现这一目标,但在目标c中执行“脏工作”很容易土地并迅速利用结果

<强> 过程

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

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

    .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 Bridging Header属性中调用的任何内容(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
    

答案 1 :(得分:0)

像这样:

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

答案 2 :(得分:0)

试试这个。

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

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