使用Delegate将变量传递回ViewController不起作用

时间:2014-08-18 22:35:37

标签: ios objective-c uiviewcontroller delegates parameter-passing

我发现了如何将字符串值从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被显示出来。它只是被忽略了。

据我所知,委托被正确声明。

我错过了什么吗?

3 个答案:

答案 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;