我有一个简单的应用程序,它包含一个带有 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 segue
从 Videos UICollectionView
到 LanguagesFromVideo 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.selectedLanguages
在LanguagesFromVideo
中为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/