我正在创建一个自定义 UICustomView,它是 UIView 的子视图。我可以在其中创建一个自定义的指定初始化程序,它将要求一个委托和数据源。但这只会在控件使用者以编程方式创建控件时调用。
但是,我想提供基本的布局支持,即。应该可以将一个空的 UIView 放入任何 NIB 文件中,然后将其在 Identity Inspector 中的类更改为 UICustomView。以类似的方式,您可以将其他库存 Apple 控件放入笔尖。
但是,我将如何强制消费者提供委托和数据源?
我正在创建一个自定义 UICustomView,它是 UIView 的子视图。我可以在其中创建一个自定义的指定初始化程序,它将要求一个委托和数据源。但这只会在控件使用者以编程方式创建控件时调用。
但是,我想提供基本的布局支持,即。应该可以将一个空的 UIView 放入任何 NIB 文件中,然后将其在 Identity Inspector 中的类更改为 UICustomView。以类似的方式,您可以将其他库存 Apple 控件放入笔尖。
但是,我将如何强制消费者提供委托和数据源?
如果我正确理解您的问题,您可以使用 initWithCoder: 来做您想做的事。这将要求来自 xib 或故事板的视图。
不幸的是,没有办法使用 nib 文件中的自定义初始化程序。最常见的是,需要数据源和委托的视图使用视图类中的 IBOutlet 属性进行连接,或者在呈现视图之前在视图控制器中设置它们的属性。
如果你想强制消费者提供委托和数据源,你总是可以在-viewDidLoad
方法中放置一个断言并确保它们已经连接(并在你使用它时处理正确的协议)。
正如@gaige 所说,只需在您的自定义视图类中获取数据源和委托的 IBOutlet 属性即可。您还可以在以编程方式创建时提供指定的初始化程序来设置这些值。如果有出口属性,您可以在界面构建器中将它们连接起来,就像我们使用普通的 TableViews 一样。
我认为解决您的问题的最常见和快速的方法是自定义 viewDidLoad 方法在与您的视图关联的控制器的 viewdidload 方法中初始化类的属性。