2013-09-23 18 views
9

我得到的UITableViewCell一個UIButton屬於這樣的:獲取的UITableViewCell與上海華在iOS的7

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

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

而且它在任何iOS的7前工作正常,但給我:

[UITableViewCellScrollView項目]:如果我在的iOS 7上運行應用程序,但如果我這樣做發送到實例0x17ae2cf0

無法識別的選擇:

-(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); 

但跆拳道是怎麼回事!? 有誰知道爲什麼會發生這種情況?

謝謝!

+2

你的代碼是根據的UITableViewCell的'私有子視圖結構'。很明顯,iOS 7中的結構已經發生了變化。有很多更安全的方法來執行您想要的操作。並且你的新代碼將在iOS 7.1和iOS 8下破解。 – rmaddy

+0

@rmaddy什麼是更安全的方式? – Mundi

+1

你可以遍歷superviews,檢查它們是否是類類型的UITableViewCell,然後返回該視圖?看到回答: – CW0007007

回答

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 
+9

一旦找到匹配的超級視圖,可以通過添加「break」來改進此代碼。無需每次都去窗口。 – rmaddy

-2
if ([[button superView] isKindOfClass:[UITableViewCell class]]) { 

} 

else //check next : 
13

做到這一點,最好的辦法是:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition]; 
UITableViewCell *cell = (UITableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath]; 
+0

最佳答案,非常可靠的決定 – zest

3

要完成的@托馬斯 - 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) 
+0

child.findSuperViewWithClass(TableViewCell.self) – sasquatch