9

UIButton が属する UITableViewCell を次のように取得しています。

-(void)buttonHandler:(UIButton *)button {

    OrderCell *cell = [[button superview] superview];
    NSLog(@"cell.item = %@", cell.item.text);

そして、iOS 7より前のすべてで問題なく動作します。しかし、私に与えます:

[UITableViewCellScrollView アイテム]: インスタンス 0x17ae2cf0 に送信された認識されないセレクター

iOS 7 でアプリを実行した場合。しかし、実行した場合:

-(void)buttonHandler:(UIButton *)button {

    OrderCell *cell = [[[button superview] superview] superview];
    NSLog(@"cell.item = %@", cell.item.text);

その後、iOS 7 で動作しますが、それ以前では動作しません?!?!?!

私はこれを行うことで問題を回避しています:

OrderCell *cell;
if([[[UIDevice currentDevice] systemVersion] isEqualToString:@"7.0"])
    cell = [[[button superview] superview] superview];
else
    cell = [[button superview] superview];

NSLog(@"cell.item = %@", cell.item.text);

しかし、WTF が起こっている!? なぜこれが起こるのか誰か知っていますか?

ありがとう!

4

5 に答える 5

27

より良い解決策は、UIView(SuperView) のカテゴリを追加し、次の方法で呼び出すことです。

UITableViewCell *cell = [button findSuperViewWithClass:[UITableViewCell class]]

このようにして、コードは将来および過去のすべての iOS バージョンで機能します

@interface UIView (SuperView)

- (UIView *)findSuperViewWithClass:(Class)superViewClass;

@end


@implementation UIView (SuperView)

- (UIView *)findSuperViewWithClass:(Class)superViewClass {

    UIView *superView = self.superview;
    UIView *foundSuperView = nil;

    while (nil != superView && nil == foundSuperView) {
        if ([superView isKindOfClass:superViewClass]) {
            foundSuperView = superView;
        } else {
            superView = superView.superview;
        }
    }
    return foundSuperView;
}
@end
于 2013-09-23T15:44:58.673 に答える
3

@ thomas-keuleersの回答を完了するには、これが迅速な方法です。

extension UIView {

    func findSuperViewWithClass<T>(superViewClass : T.Type) -> UIView? {

        var xsuperView : UIView!  = self.superview!
        var foundSuperView : UIView!

        while (xsuperView != nil && foundSuperView == nil) {

            if xsuperView.self is T {
                foundSuperView = xsuperView
            } else {
                xsuperView = xsuperView.superview
            }
        }
        return foundSuperView
    }

}

そして、あなたは単にそのように呼び出します:

child.findSuperViewWithClass(TableViewCell)
于 2015-06-05T15:04:16.270 に答える