当使用模态呈现的NavigationController(iOS 5 - Storyboard)时,委托不工作

时间:2011-12-07 14:03:53

标签: delegates uinavigationcontroller interface-builder ios5 segue

我的协议存在问题。

我的“初始视图控制器”是一个导航控制器。在根页面上,我展示了另一个导航控制器,其中嵌入了View Controller。 onclick一个segue应该被解雇...这完全有效但是“ViewController”中的委托方法永远不会被调用。

我添加的图像是一个示例,说明如何在iOS 5中使用InterfaceBuilder构建2个NavigationControllers之间的连接。

image

MyViewController.h

@protocol MyProtocol <NSObject>

@required
- (void) myFunction:(NSString *)string;

@end

@interface MyViewController : UIViewController <MyProtocol>

@property (nonatomic, assign) id<MyProtocol> delegate;

@end

MyViewController.m

#import "MyViewController.h"
@implementation PropertyController
@synthesize delegate = _delegate;

- (void) myFunction:(NSString *)string {
    [_delegate myFunction:string];
}

- (IBAction) callDelegate:(id)sender {
     ![enter image description here][1][self myFunction:@"test"];
}

这是ViewController的代码,它显示了上面的NavigationController

ViewController.h

#import "MyViewController.h"

@interface ViewController : UIViewController <MyProtocol>

ViewController.m

#import "ViewController.h"

@implementation ViewController

- (void) myFunction:(NSString *)string {
    NSLog(@"myFunction was called");
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [((MyViewController *) segue.destinationViewController) setDelegate:self];
}

- (IBAction) showModalNavigationController {
    [self performSegueWithIdentifier:@"NameFromSegueInInterfaceBuilder" sender:self];
}

我无法找到解决问题的方法。

我希望有人可以帮助我

谢谢你:)

2 个答案:

答案 0 :(得分:1)

我在这里看到了几个问题:

  1. 在故事板截图中,您有第二个导航控制器。您不应该需要将PropertyController嵌入导航控制器中。相反,让根视图控制器直接转到PropertyController。如果由于某种原因您确实需要该导航控制器,那么您需要更改上面的prepareForSegue实施,因为在这种情况下segue.destinationViewController指向UINavigationController。因此,您需要获取该导航控制器对象,然后将setDelegate发送到该导航控制器对象的rootViewController。但是,只有当你决定保留那个导航控制器时才会这样。
  2. MyViewControllerViewControllerPropertyController课程的关系如何? PropertyController类(或超类)需要具有@property属性的synthesizedelegate语句。

答案 1 :(得分:0)

我一直有同样的问题,为了使它工作,我找到了一个xcode并不喜欢的工作,但它仍然在工作 - &gt;设置您的委托,使您的导航控制器将您的视图作为委托,如果您在目标控制器中的NSLog self.delegate它将为null。为了防止这种情况,请执行 - >

self.delegate = self.navigationController.delegate; 

在目标控制器(viewdidload)中,它将获得您在导航控制器上创建的委派,并允许您在目标控制器中使用它

它很脏,但这是我找到的唯一方法。希望它有所帮助。