使用 Delegate 将变量传递回 ViewController 不起作用
Posted
技术标签:
【中文标题】使用 Delegate 将变量传递回 ViewController 不起作用【英文标题】:Passing variables back to a ViewController using a Delegate does not work 【发布时间】:2014-08-18 22:35:37 【问题描述】:我找到了一个非常好的教程,介绍了如何将字符串值从 ViewController 传递回调用 ViewController 并让它完美地工作。这个例子真的很好。
https://www.youtube.com/watch?v=YVikeoR3gYg
也就是说,回传内容的技术在我看到后似乎相对简单,即使它不是那么直观。
然而,示例代码仅包含两个控制器。当我使用更详细的 Storyboard 复制代码时,代码根本不起作用。在我的测试应用程序中,我什至将调用控制器嵌入到 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”会被传递回调用控制器。
在我的调用控制器中,我有以下内容:
- (void)passBackIcon:(NSString *)iconName
NSLog(@"Icon to use is %@", iconName);
但这根本没有被调用(或者至少我没有看到 NSLog 被显示。它只是被忽略了。
据我所知,委托已正确声明。
我错过了什么吗?
【问题讨论】:
你在哪里设置代理? 【参考方案1】:假设您正在使用 segues,您应该在方法 prepareSegue 中设置委托 例如:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"YOUR_SEGUE_IDENTIFIER"] )
DestinationVc *vc = (DestinationVc *)segue.destinationViewController;
[vc setDelegate:self];
希望对你有用
【讨论】:
谢谢@klinkert0278。这已经在我的 prepareForSegue 中: if ([segue.identifier isEqualToString:@"sw_setIcons"]) IconCollectionViewController *destViewController = segue.destinationViewController; [destViewController setDelegate:self]; 如上所述 - 原来我使用的是您的建议,但 segue 标识符不正确。谢谢【参考方案2】:我发现这是使用 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];
【讨论】:
谢谢 - 这很好。我也会尝试这个,但我似乎在这里遇到了一个基本问题,我也需要解决这个问题。我确定在某些时候我也需要使用非 tableView。【参考方案3】:我建议您将您的委托包装在检查中以查看它是否有效并且它已采用相应的方法(如果可选)。
if(self.delegate && [self.delegate respondsToSelector:@selector(passBackIcon:)])
[self.delegate passBackIcon:itemToPassBack];
else
NSLog(@"Your delegate is not setup correctly");
如果它进入else,你没有正确设置委托..即你可能从来没有这样做过
self.delegate = SomeInstanceOfAClassThatAdoptsYourDelegate;
【讨论】:
谢谢!我收到“您的代表未正确设置”。这是个好消息(有点)。但是,我不知道为什么。我已经设置好代表了。在调用控制器中,我执行以下操作: IconCollectionViewController *destViewController = segue.destinationViewController; [destViewController setDelegate:self]; 这对它进行了排序。知道委托没有响应选择器是关键。事实证明,在重新排列我的 Storyboard 时,我删除了 segue 并重新创建了它,并且没有再次设置 segue 标识符。非常感谢。以上是关于使用 Delegate 将变量传递回 ViewController 不起作用的主要内容,如果未能解决你的问题,请参考以下文章