在 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;
}

使用此示例 UITableViewCellinitWithStyle: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
            }

        }
    }
}