我发现了如何将字符串值从ViewController传递回调用ViewController并使其完美运行的非常好的演绎。这个例子非常好。
https://www.youtube.com/watch?v=YVikeoR3gYg
也就是说,现在我已经看过它,传回内容的技术看起来相对简单,即使它不那么直观。
但是示例代码只包含两个控制器。当我使用更详细的故事板复制代码时,代码根本不起作用。在我的测试应用程序中,我甚至将调用Controller嵌入到NavigationController中以查看是否会产生影响,但它仍然可以继续正常工作。
在我的应用程序中,ViewController嵌入在一个通过SWRevealController segue类调用的NavigationController中。我不知道这是重要还是相关,但我提到它。
然后我调用一个CollectionViewController来选择一个应该传递回调用ViewController的图标。
当我选择图标时,我正确识别图标并弹出
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
selectedIcon = [placeIcons objectAtIndex:indexPath.row];
NSLog(@"In IconCollectionViewControlled - selected %@", selectedIcon);
NSString *itemToPassBack = @"12345"; // Just testing any old string here...
// [self.delegate passBackIcon:selectedIcon]; // commenting out while testing
[self.delegate passBackIcon:itemToPassBack];
[self.navigationController popViewControllerAnimated:YES];
}
我得到正确的跟踪,表明选择了正确的图标。我希望文本'12345'将被传递回调用Controller。
在我的呼叫控制器中,我有以下内容:
- (void)passBackIcon:(NSString *)iconName {
NSLog(@"Icon to use is %@", iconName);
}
但这根本就没有被调用(或者至少我没有看到NSLog被显示出来。它只是被忽略了。
据我所知,委托被正确声明。
我错过了什么吗?
答案 0 :(得分:2)
假设你正在使用segues,在方法prepareSegue中你应该设置委托 例如:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"YOUR_SEGUE_IDENTIFIER"] ) {
DestinationVc *vc = (DestinationVc *)segue.destinationViewController;
[vc setDelegate:self];
}
}
希望它适合你
答案 1 :(得分:1)
我发现这是使用tableView传递字符串和其他信息的最简单方法。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
ViewControllerYouWantToPassToo *result = [self.storyboard instantiateViewControllerWithIdentifier:@"NameOfTheViewController"];
result.stringName = @"12345" // String Name is a NSString property you set up in the ViewController you want to pass too
[self.navigationController pushViewController:result animated:YES];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
答案 2 :(得分:0)
我建议你将你的委托包装在一张支票中,看它是否有效,并且采用了相应的方法(如果是可选的)。
if(self.delegate && [self.delegate respondsToSelector:@selector(passBackIcon:)]){
[self.delegate passBackIcon:itemToPassBack];
}else{
NSLog(@"Your delegate is not setup correctly");
}
如果它进入了else,你没有正确设置委托......你可能从未做过
self.delegate = SomeInstanceOfAClassThatAdoptsYourDelegate;