在popViewControllerAnimated中传回字符串

时间:2015-05-03 19:57:17

标签: ios uitableview delegates didselectrowatindexpath

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

然后我按下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;
}

1 个答案:

答案 0 :(得分:1)

一些事情:

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

关于你的问题:你通过segue呈现视图!?因此,您需要覆盖prepareForSegue方法,从destinationViewController中提取segue并将其delegate属性设置为self。没有它,您的ViewController2永远不会获得有效的委托集。所有这些都需要在viewController 呈现 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的标识符,并在上面的ode中使用相同的标识符,或者删除if all all(unclean)。