自定义代理没有响应

时间:2014-05-13 17:55:18

标签: ios objective-c uitableview ios7

我有第一个 viewController" SFCrearMomentoViewController"并且第二个视图是tableViewController" MasterViewController"。我需要选择一行didSelectRowAtIndexPath并调用我的" first viewController"中实现的方法didCelected。并使用dismissViewControllerAnimated关闭视图。

问题是永远不会调用方法didCelected。我已经使用"两个viewControllers"在测试项目中测试了这段代码。它有效,但我不知道当前项目中的问题是什么。

SFCrearMomentoViewController.h

...
#import "MasterViewController.h"
@interface SFCrearMomentoViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextViewDelegate, MasterViewControllerDelegate>{
    UIImagePickerController *picker;
}
...

SFCrearMomentoViewController.m

...
-(void)didSelected:(NSString *)nombre{
    NSLog(@"didSelected method %@", nombre);
}


@end

MasterViewController.h

#import <UIKit/UIKit.h>

@protocol MasterViewControllerDelegate <NSObject>

@required
-(void) didSelected:(NSString *)nombre;

@end

@interface MasterViewController : UITableViewController

@property (weak, nonatomic) id <MasterViewControllerDelegate> delegate;

@end

MasterViewController.m

...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [self.delegate didSelected:@"row selected"];
    [self dismissViewControllerAnimated:YES completion:nil];
}
...

解决方案:我必须设置委托自己。我在 Segue 中实现了它。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.destinationViewController isKindOfClass:[MasterViewController class]]) {
        MasterViewController *nextView = segue.destinationViewController;
        nextView.delegate = self;
    }
}

2 个答案:

答案 0 :(得分:1)

几小时前我遇到了同样的问题。在我的情况下,我将prepareForSegue中的委托设置为segue.destinationViewController,但我的目标视图控制器不是具有委托的View Controller,它是一个UINavigationController。 所以我使用了这个:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"modalNeuerRaum"])
    {
        [(MyCustomModalViewController*)[(UINavigationController*)segue.destinationViewController viewControllers][0] setDelegate:self];
    }
}

这对我有用,但我不知道你是否有UINavigationController ..

答案 1 :(得分:0)

您需要在SFCrearMomentoViewController中设置委托,例如,您可以在viewDidLoad中设置委托。

masterViewController.delegate = self;

我假设你分配并初始化了MasterViewController类型的新masterViewController对象。