3

我正在我的 CarPlay 音频应用程序中添加一个列表(表格视图)。在 AppDelegate.m 中,我有

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ..........

    [MPPlayableContentManager sharedContentManager].dataSource = self;
    [MPPlayableContentManager sharedContentManager].delegate = self;

    return YES;
}

我还在 AppDelegate.m 中实现了 MPPlayableContentDataSource 方法:

- (NSInteger)numberOfChildItemsAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.row)
    {
        case 0:
            return 3;

        case 1: 
            return 2;

        default:
            return 4;
    }
}

- (MPContentItem *)contentItemAtIndexPath:(NSIndexPath *)indexPath
{
    MPContentItem *contentItem = [[MPContentItem alloc] initWithIdentifier:@"container"];
    .................

    return contentItem;
}

但是,应用程序在切换 (indexPath.row) 时崩溃并显示“与 UITableView 一起使用的索引路径无效。传递给表视图的索引路径必须恰好包含两个指定节和行的索引。如果可能,请使用 UITableView.h 中 NSIndexPath 上的类别。我在这里做错了吗?提前致谢。

4

1 回答 1

4

MPPlayableContentDataSource 使用 NSIndexPath 与 UITableView 不同。为了indexPath.row工作 indexPath 必须包含恰好 2 个元素,但 numberOfChildItemsAtIndexPath: 可以使用由 0 到 5 个元素组成的 indexPath 调用 - 这就是您的代码崩溃的原因

numberOfChildItemsAtIndexPath:通常应该描述您的导航树 - 为导航中的特定节点提供 indexPath 它应该返回您可以从该节点导航到的节点数

修复代码的一些方法是:

- (NSInteger)numberOfChildItemsAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.length == 0) {
        // In a root of our navigation we have 3 elements
        return 3;
    }
    if (indexPath.length == 1) {
        switch ([indexPath indexAtPosition:0]) {
            case 0:
                // After tapping first item on our root list we see list with 3 elements
                return 3;
            case 1:
                // for second one we get list with 2 elements
                return 2;
            default:
                return 4;
        }
    }
    return 0;
}

我建议观看 WWDC 视频“为 CarPlay 启用您的应用程序”,尤其是从6:00开始,他们展示了很好的示例。

于 2017-10-18T10:56:07.383 回答