在 popViewController Animated 中传回字符串

Passing string back in popViewControllerAnimated

我有一个 UIViewController(1),我按下该控制器中的一个视图,然后它推送另一个 UIViewController(2),其中有一个全屏 UITableView。

然后我按下 UITableView 中的一个单元格,并想将 UITableView 中的一个字符串传回给 UIViewController(1)。我试过使用下面的 delegete 方法但是它不起作用,请有人建议。

UIViewController2.h
@protocol SecondDelegate <NSObject>
-(void) secondViewControllerDismissed:(NSString *)stringForFirst;
@end

@interface ViewController2 : UIViewController
{
    id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
@end

UIViewController2.m (inside didSelectRowAtIndexPath)
    [self.myDelegate secondViewControllerDismissed:@"the string I'm passing"];

UIViewController1.h
import "ViewController2.h"
    @interface ViewController1 : UIViewController <SecondDelegate>

@end

UIViewController1.m
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
    NSString *myString = stringForFirst; 
    self.myLabel.text = myString;
}

几件事:

  • 删除 @interface ViewController2
  • 中的 id myDelegate;
  • 将您的 @property (nonatomic, assign) id... 更改为 @property (nonatomic, weak) id...,这样更安全(参见 why

关于你的问题:你是通过segue呈现视图的!?因此,您需要覆盖prepareForSegue方法,从segue中提取destinationViewController并将其delegate 属性设置为self。否则,您的 ViewController2 永远不会获得有效的委托集。所有需要在 viewController presenting ViewController2:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [super prepareForSegue:segue sender:sender];
    if ([segue.identifier isEqualToString:@"yourCustomSegueIdentifier"]) {
        ViewController2 *controller = (ViewController2*)segue.destinationViewController;
        controller. myDelegate = self;
    }
}

要么在故事板中设置您的 segue 的标识符,并在上面的颂歌中使用相同的标识符,要么一起删除 if(不干净)。