在 iOS7 - Swift 中点击时 UIButton 不显示突出显示
UIButton not showing highlight on tap in iOS7 - Swift
来自 this post 他们说这是 ios 7 和 8 中的一个错误 - UITableViewCell
中的按钮在点击时不会变为突出显示。在这里,我 post 在 Objective-C:
中给出了一个答案
创建自定义 UITableView
子类和自定义 UITableViewCell
子类。
使用此示例 UITableView
的 initWithFrame:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// iterate over all the UITableView's subviews
for (id view in self.subviews)
{
// looking for a UITableViewWrapperView
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewWrapperView"])
{
// this test is necessary for safety and because a "UITableViewWrapperView" is NOT a UIScrollView in iOS7
if([view isKindOfClass:[UIScrollView class]])
{
// turn OFF delaysContentTouches in the hidden subview
UIScrollView *scroll = (UIScrollView *) view;
scroll.delaysContentTouches = NO;
}
break;
}
}
}
return self;
}
使用此示例 UITableViewCell
的 initWithStyle:reuseIdentifier:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
// iterate over all the UITableViewCell's subviews
for (id view in self.subviews)
{
// looking for a UITableViewCellScrollView
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewCellScrollView"])
{
// this test is here for safety only, also there is no UITableViewCellScrollView in iOS8
if([view isKindOfClass:[UIScrollView class]])
{
// turn OFF delaysContentTouches in the hidden subview
UIScrollView *scroll = (UIScrollView *) view;
scroll.delaysContentTouches = NO;
}
break;
}
}
}
return self;
}
但是我不能写Swift。有一些问题:
1) 我做不到
self = super.init(style: style, reuseIdentifier: reuseIdentifier)
错误:无法在方法
中分配给 'self'
2) 在Swift,我做不到
view.class
如 Objective C:
[view class]
我已经搜索了几个小时,但仍然找不到我想要的。
请任何人在 Swift?
中回答这个问题
在 Swift 中调用超类的指定初始化器,而不是调用 self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]
,您只需使用 super.init(style: style, reuseIdentifier: reuseIdentifier)
感谢 Schemetrical,这是适合我的工作版本。 (iOS 7 + 8)
首先我写了一个效用函数:
class func classNameAsString(obj: AnyObject) -> String {
return _stdlib_getDemangledTypeName(obj).componentsSeparatedByString(".").last!
}
然后我将 UITableView 子类化并实现它:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
for view in self.subviews {
if (Utility.classNameAsString(view) == "UITableViewWrapperView") {
if view.isKindOfClass(UIScrollView) {
var scroll = (view as UIScrollView)
scroll.delaysContentTouches = false
}
break
}
}
}
我还继承了 UITableViewCell 并实现了这个:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
for view in self.subviews {
if (Utility.classNameAsString(view) == "UITableViewCellScrollView") {
if view.isKindOfClass(UIScrollView) {
var scroll = (view as UIScrollView)
scroll.delaysContentTouches = false
}
}
}
}
来自 this post 他们说这是 ios 7 和 8 中的一个错误 - UITableViewCell
中的按钮在点击时不会变为突出显示。在这里,我 post 在 Objective-C:
创建自定义 UITableView
子类和自定义 UITableViewCell
子类。
使用此示例 UITableView
的 initWithFrame:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// iterate over all the UITableView's subviews
for (id view in self.subviews)
{
// looking for a UITableViewWrapperView
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewWrapperView"])
{
// this test is necessary for safety and because a "UITableViewWrapperView" is NOT a UIScrollView in iOS7
if([view isKindOfClass:[UIScrollView class]])
{
// turn OFF delaysContentTouches in the hidden subview
UIScrollView *scroll = (UIScrollView *) view;
scroll.delaysContentTouches = NO;
}
break;
}
}
}
return self;
}
使用此示例 UITableViewCell
的 initWithStyle:reuseIdentifier:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
// iterate over all the UITableViewCell's subviews
for (id view in self.subviews)
{
// looking for a UITableViewCellScrollView
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewCellScrollView"])
{
// this test is here for safety only, also there is no UITableViewCellScrollView in iOS8
if([view isKindOfClass:[UIScrollView class]])
{
// turn OFF delaysContentTouches in the hidden subview
UIScrollView *scroll = (UIScrollView *) view;
scroll.delaysContentTouches = NO;
}
break;
}
}
}
return self;
}
但是我不能写Swift。有一些问题:
1) 我做不到
self = super.init(style: style, reuseIdentifier: reuseIdentifier)
错误:无法在方法
中分配给 'self'2) 在Swift,我做不到
view.class
如 Objective C:
[view class]
我已经搜索了几个小时,但仍然找不到我想要的。
请任何人在 Swift?
中回答这个问题在 Swift 中调用超类的指定初始化器,而不是调用 self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]
,您只需使用 super.init(style: style, reuseIdentifier: reuseIdentifier)
感谢 Schemetrical,这是适合我的工作版本。 (iOS 7 + 8)
首先我写了一个效用函数:
class func classNameAsString(obj: AnyObject) -> String {
return _stdlib_getDemangledTypeName(obj).componentsSeparatedByString(".").last!
}
然后我将 UITableView 子类化并实现它:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
for view in self.subviews {
if (Utility.classNameAsString(view) == "UITableViewWrapperView") {
if view.isKindOfClass(UIScrollView) {
var scroll = (view as UIScrollView)
scroll.delaysContentTouches = false
}
break
}
}
}
我还继承了 UITableViewCell 并实现了这个:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
for view in self.subviews {
if (Utility.classNameAsString(view) == "UITableViewCellScrollView") {
if view.isKindOfClass(UIScrollView) {
var scroll = (view as UIScrollView)
scroll.delaysContentTouches = false
}
}
}
}