ios - 从 UICollectionView 使用 Push Segue 时空白 UITableView

标签 ios objective-c uitableview uicollectionview

我有一个简单的应用程序,它包含一个带有 4 个选项卡的 UITabBarController。在第一个选项卡上,我有一个带有静态语言列表的 UITableViewController(在 Interface Builder 中设计)。此 UITableViewController 称为 Videos。我还有一个 LanguagesFromVideos UITableViewController,它也是在 Interface Builder 中设计的。这是一个动态的 UITableView

如果用户点击第一个单元格,他们将被带到 Videos UITableView LanguagesFromVideos 中,它将填充该语言的数据,如果用户单击第二个单元格,它将填充来自该语言的数据。我在 Interface Builder 中的 Videos 上每行都有一个 segue。

我正在更改设计,以便“视频”选项卡现在成为 UICollectionViewController 而不是 UITableViewController

我在 Interface Builder 中设计了一个单元格,其中所有 cells 都是使用 NSArray 从代码中动态填充的>。

问题

我现在面临的问题是,从 UICollectionView 中的单元格到 LanguagesFromVideo 的转场没有正确发生。如果我点击中文,它应该在 LanguagesFromVideo UITableView 中显示中文信息,如果我点击英文,它应该在 LanguagesFromVideo 中显示中文信息,等等。

我在这里没有看到任何想要的结果。我点击中文,它加载了一个 View ,但该 View 是空白的。

插入 segue 很重要。

在我的 UICollectionViewCell didSelectItemAtIndexPath 中,我有:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{

    VideosTabCollectionCell *videosTabCell = (VideosTabCollectionCell *)[collectionView cellForItemAtIndexPath:indexPath];

    if ([videosTabCell.videosTabCellLabel.text isEqualToString:@"Chinese\n汉语"])
    {
        LanguageFromVideoTabTableViewController *lfvtvc = [[LanguageFromVideoTabTableViewController alloc] init];
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Chinese Videos" ofType:@"txt"];
        NSString *testString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        NSArray *listOfVideos = [testString componentsSeparatedByString:@"\n"];
        NSMutableArray *availableVideosToPass = [listOfVideos mutableCopy];

        NSString *theSelectedLanguage = @"Chinese - 汉语";

//        [self presentViewController:lfvtvc animated:YES completion:nil];

        [lfvtvc setAvailableVideos:availableVideosToPass];
        [lfvtvc setSelectedLanguage:theSelectedLanguage];

    }

}

以前,LanguagesFromVideo UITableView 是使用文本文件等填充的。这部分没有任何变化。我仍然需要从中文UICollectionViewCell 转到LanguagesFromVideo,显示中文信息,其他语言也一样。

这行不通,我一直坚持这一点。我注意到 UICollectionView 上没有 prepareForSegue 方法。

更新

我在 Interface Builder 中创建了一个 push segueVideos UICollectionViewLanguagesFromVideo UITableView 并调用它:languagesFromVideoSegue。在 didSelectItemAtIndexPath 中,我尝试了:

[self performSegueWithIdentifier:@"languagesFromVideoSegue" sender:self];

这导致了空白 View Controller 的转场。我猜它还没有用我在此 didSelectItemAtIndexPath 中提供的内容加载 LanguagesFromVideo

更新 2

尝试使用 prepareForSegue 而不是 didSelectItemAtIndexPath,我有:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    if ([[segue identifier] isEqualToString:@"languagesFromVideoSegue"])
    {
        LanguageFromVideoTabTableViewController *lfvtvc = (LanguageFromVideoTabTableViewController*)segue.destinationViewController;
        // Here, I will create the text file with a list of languages. The text file
        // already exists and we are passing it in here, with the creation of a NSArray
        // and then creating a copy for an NSMutableArray to pass.
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Chinese Videos" ofType:@"txt"];
        NSString *testString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        NSArray *listOfVideos = [testString componentsSeparatedByString:@"\n"];
        NSMutableArray *availableVideosToPass = [listOfVideos mutableCopy];

        NSString *theSelectedLanguage = @"Chinese - 汉语";

        [self performSegueWithIdentifier:@"languagesFromVideoSegue" sender:@"Chinese"];
        //        [self presentViewController:lfvtvc animated:YES completion:nil];
        [segue destinationViewController];
        [lfvtvc setAvailableVideos:availableVideosToPass];
        [lfvtvc setSelectedLanguage:theSelectedLanguage];

    }

}

有了这个,segue 就根本不会发生了。

更新 3

我已经在 Interface Builder 中从 View Controller 本身设置了 segue,而不是从 UICollectionViewCell。现在在 didSelectItemAtIndexPath(不使用 prepareForSegue)中,我正在运行上面看到的代码,但添加了:

    [self performSegueWithIdentifier:@"languagesFromVideoSegue" sender:self];

发生了segue,但它是空白的,因为self.selectedLanguagesLanguagesFromVideo中为nil(在传递之前不是nil) .

如果对此有任何想法,我们将不胜感激。

最佳答案

你可以使用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

如果您将 segue 添加为 Storyboard中集合中的 push segue。在这种情况下,所选单元格将是发件人
如果您在 didSelectRowAtIndexPath 中以编程方式启动 segue,您可以将任何您想要的作为发件人传递。

比起使用 prepareForSegue 来设置你的数据:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [super prepareForSegue:segue sender:sender];

    if ([sender isKindOfClass:[UITableViewCell class]])
    {
        UITableViewCell *cell = sender;
        // now you can set your data.
    }
}

关于ios - 从 UICollectionView 使用 Push Segue 时空白 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34315814/

相关文章:

ios - 从容器 View 内的 TableView 单元格进行 Segue 不起作用

ios - iPhone 6 的不同 Storyboard

ios - 如何以编程方式在 google map 中移动一个点 xcode

objective-c - 如何从 Kal 控件中获取选定的日期?

ios - 我设置页脚高度 0.0 仍然显示在 uitableview 中

swift - tableView.setContentOffset(_, 动画 :) do not work after beginUpdates()

ios - 如何使 collectionview 响应其自身 View 之外的平移手势

objective-c - 是否可以在 UIView 类中传递参数

ios - 如何编辑 UITableViewController

ios - 3D Touch 快速操作根本不起作用