【问题标题】:UITableViewCell indexPath crash in iOS7iOS7中的UITableViewCell indexPath崩溃
【发布时间】:2013-09-26 00:14:09
【问题描述】:

我在UITableViewController 中有一个UITableViewCell。 在我的单元格中有一个按钮,当您单击该按钮时,您将转到另一个带有prepareforsegueview。 在prepareForSegue 我这样做:

if ([[segue identifier] isEqualToString:@"MySegue"])
{
    UITableViewCell *cell = (UITableViewCell*) [[sender superview] superview];
    UITableView *table = (UITableView*)[[[sender superview] superview] superview];
    NSIndexPath *indexPath = [table indexPathForCell:cell]; 
}

好的!一切一直运作良好。但是现在我已经用 iOS7 升级了 xCode,当我点击单元格中的按钮时,出现一个错误,我不知道如何解决它:

[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0x9e160b0
2013-09-20 16:30:44.427 MyApp[8212:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0x9e160b0'
*** First throw call stack:
(
    0   CoreFoundation                      0x024475e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x01a5d8b6 objc_exception_throw + 44
    2   CoreFoundation                      0x024e4903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x0243790b ___forwarding___ + 1019
    4   CoreFoundation                      0x024374ee _CF_forwarding_prep_0 + 14
    5   MyApp                              0x0004bc01 -[NewsTableViewController prepareForSegue:sender:] + 3441
    6   UIKit                               0x00af69cc -[UIStoryboardSegueTemplate _perform:] + 156
    7   UIKit                               0x00af6a59 -[UIStoryboardSegueTemplate perform:] + 115
    8   libobjc.A.dylib                     0x01a6f874 -[NSObject performSelector:withObject:withObject:] + 77
    9   UIKit                               0x005c4c8c -[UIApplication sendAction:to:from:forEvent:] + 108
    10  UIKit                               0x005c4c18 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
    11  UIKit                               0x006bc6d9 -[UIControl sendAction:to:forEvent:] + 66
    12  UIKit                               0x006bca9c -[UIControl _sendActionsForEvents:withEvent:] + 577
    13  UIKit                               0x006bbd4b -[UIControl touchesEnded:withEvent:] + 641
    14  UIKit                               0x00936d7f _UIGestureRecognizerUpdate + 7166
    15  UIKit                               0x00601d4a -[UIWindow _sendGesturesForEvent:] + 1291
    16  UIKit                               0x00602c6a -[UIWindow sendEvent:] + 1030
    17  UIKit                               0x005d6a36 -[UIApplication sendEvent:] + 242
    18  UIKit                               0x005c0d9f _UIApplicationHandleEventQueue + 11421
    19  CoreFoundation                      0x023d08af __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    20  CoreFoundation                      0x023d023b __CFRunLoopDoSources0 + 235
    21  CoreFoundation                      0x023ed30e __CFRunLoopRun + 910
    22  CoreFoundation                      0x023ecb33 CFRunLoopRunSpecific + 467
    23  CoreFoundation                      0x023ec94b CFRunLoopRunInMode + 123
    24  GraphicsServices                    0x032c89d7 GSEventRunModal + 192
    25  GraphicsServices                    0x032c87fe GSEventRun + 104
    26  UIKit                               0x005c394b UIApplicationMain + 1225
    27  MyApp                              0x00002cfb main + 235
    28  libdyld.dylib                       0x01f42725 start + 0
    29  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

应用崩溃的那一行是这样的:

    NSIndexPath *indexPath = [table indexPathForCell:cell]; }

【问题讨论】:

    标签: uitableview segue ios7 superview


    【解决方案1】:

    在iOS7中UITableViewWrapperViewUITableViewCell的superview,对你来说意味着另一个superview:

    iOS7:

    UITableView *tableView = (UITableView *)cell.superview.superview;
    

    iOS6"

    UITableView *tableView = (UITableView *)cell.superview;
    

    另一个变化你可以找到它here

    似乎您的代码: UITableView table = (UITableView)[[[sender superview] superview] superview];返回 UITableViewCell 而不是 UITableView

    试试下面的:

    UITableView *table = (UITableView*)[[[[[sender superview] superview] superview] superview] superview];
    

    【讨论】:

    • 在 iOS 8 中,视图层次结构似乎与 iOS 6 中的一样,所以再次使用即时超级视图。
    【解决方案2】:

    Apple 在 iOS 7 中更改 UITableViewCell 层次结构

    使用 iOS 6.1 SDK

    <UITableViewCell>
       | <UITableViewCellContentView>
       |    | <UILabel>
    

    使用 iOS 7 SDK

    <UITableViewCell>
       | <UITableViewCellScrollView>
       |    | <UITableViewCellContentView>
       |    |    | <UILabel>
    

    因此,如果您想在按钮索引处获取索引路径,请使用以下代码使用 iOS 6 或更高版本的 SDK

    UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
        NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
        NSLog(@"index=%@",clickedButtonPath);
    

    使用 iOS 7 或 7+ SDK

    UITableViewCell *clickedCell = (UITableViewCell *)[[[sender superview] superview]superview];
        NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
        NSLog(@"index=%ld",(long)clickedButtonPath.item);
    

    【讨论】:

      【解决方案3】:

      它确实有效,但我们能获得多少超级?

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,我必须从 TableView 中找到 textFileds 值

        if ([Util isiOSVerGreaterThen7]) { // iOS 7
                    UIView *contentView = (UIView *)[textField superview];
                    UITableViewCell *cell = (UITableViewCell *)[contentView superview];
                    UITableView *tableView = (UITableView *)cell.superview.superview;
                    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
        
                    NSInteger sectionOfTheCell = [indexPath section];
                    NSInteger rowOfTheCell = [indexPath row];
                }
                else { // iOS 6
                    UITableViewCell *cell = (UITableViewCell *)[textField superview];
                    UITableView *table = (UITableView *)[cell superview];
                    NSIndexPath *pathOfTheCell = [table indexPathForCell:cell];
                    NSInteger sectionOfTheCell = [pathOfTheCell section];
                    NSInteger rowOfTheCell = [pathOfTheCell row];
                }
        

        而 Util 是

        + (BOOL)isiOSVerGreaterThen7 {
            if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
                return NO;
            } else {
                return YES;
            }
        }
        

        【讨论】:

          【解决方案5】:

          这个比较好用

          NSIndexPath *indexPath = [self.callTable indexPathForCell:(UITableViewCell *)[[[sender superview] superview] superview]];
              NSLog(@"%d",indexPath.row);
          

          【讨论】:

            【解决方案6】:

            这是我认为最好的方式:

            CGPoint subviewPosition = [sender convertPoint:CGPointZero toView:self.myTable];

            NSIndexPath* indexPath = [self.myTable indexPathForRowAtPoint:subviewPosition];

            您可以在这里简单地获取索引路径。无论是iOS7还是iOS6,都会返回正确的索引路径

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多