ios自定义委托设置

时间:2012-11-22 11:22:30

标签: ios delegates protocols

我正在努力制作一个自定义协议,希望有人可以提供帮助。

我有一个带有标签的mainViewController(mainVC)。当我按下edwwVC中的按钮时,该标签需要用字符串更新。

我正在使用ARC和故事板。

问题是当我按下edwwVC上的Done按钮时,调用“done”方法但是在mainVC中没有调用委托方法。 然而,如果我通过mainVC调用done方法VIA,则调用done方法和委托方法。所以我可以看到连接在那里,我只是不明白为什么当我按下edwwVC中的完成按钮时没有调用委托方法。

我想它与edwwVC的init有关。因为它已经由storyboard启动,所以它看起来好像我在mainVC的viewDidLoad方法中再次初始化它。但那是我有多远:)

提前致谢!

edwwVC.h

#import <UIKit/UIKit.h>
#import "IIViewDeckController.h"

@class EDWWViewController;

@protocol EDWWViewControllerDelegate <NSObject>;
@optional
- (void)edwwVCDidFinish:(EDWWViewController *)edwwVC;
@end

@interface EDWWViewController : UIViewController <IIViewDeckControllerDelegate> {
__weak  id<EDWWViewControllerDelegate> delegate;
NSMutableArray *edwwPoints;
}

@property (weak) id<EDWWViewControllerDelegate> delegate;
@property (weak, nonatomic) IBOutlet UITableView *theTableView;
@property (strong, nonatomic)     NSString *testString;
- (IBAction)done:(id)sender;
- (IBAction)add:(id)sender;
@end

edwwVC.m:

#pragma mark - delegate method
- (IBAction)done:(id)sender {
testString = @"This is the test string!";
[delegate edwwVCDidFinish:self];
[self.viewDeckController closeRightViewAnimated:YES];
NSLog(@"Done pressed");
}

MainVC.m:

- (void)viewDidLoad
{
[super viewDidLoad];
edwwViewController = [[EDWWViewController alloc] init];
edwwViewController.delegate = self;
}  

- (void)edwwVCDidFinish:(EDWWViewController *)edwwVC {    
edwwLabel.text= edwwVC.testString;    
NSLog(@"delegate method called");
}

2 个答案:

答案 0 :(得分:4)

删除该行...

__weak  id<EDWWViewControllerDelegate> delegate;

从.h改变行......

[delegate edwwVCDidFinish:self];

为...

[self.delegate edwwVCDidFinish:self];

在.m。

应该对它进行排序。

你设置ivar委托的方式与属性委托(实际上是一个名为_delegate的ivar)不同(感谢@Joris Kluivers,只是为了清晰起见而添加)。他们指的是不同的东西。

如果你在调用委托方法的地方添加一个断点,我想你会发现委托是零。而_delegate(或self.delegate)不是零。

:: EDIT ::

啊......刚发现第二位。

如果您在故事板中设置edwwvc,那么您也应该分配启动它。

如果你正在转向edwwvc那么你应该像这样拦截mainVC.m中的segue ......

- (void)prepareForSegue: //blah the rest of the name...
{
    if ([segue.identifier isEqualToString:@"the name of your segue"])
    {
        EDWWViewController *controller = segue.destinationViewController;

        controller.delegate = self;
    }
}

这将从故事板中获取您要推送的控制器,并将委托设置为它。

::另一个编辑::

如果EDWWVC在containerViewController中,那么您可以在MainVC.m中的viewDidLoad中执行此操作...

- (void)viewDidLoad
{
    // other stuff...

    for (UIViewController *controller in self.childViewControllers) {
        if ([controller isKindOfClass:[EDWWViewController class]]) {
            EDWWViewController *edwwvc = (EDWWViewController*)controller;

            eddwvc.delegate = self;
        }
    }
}

您可能会发现此代码必须放在viewDidAppear中,但我认为viewDidLoad应该可以正常工作。

您实际上可以通过使用故事板来直接设置委托属性(但我不是100%肯定)。

答案 1 :(得分:0)

答案是在两个控制器的containerVC中。 我初始化视图控制器的地方:containerVC m文件的viewDidLoad:

- (void)viewDidLoad
{
[super viewDidLoad];

mainVC = (MainViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"MainVC"];
edwwVC = (EDWWViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"EDWWVC"];
//THIS LINE WAS MISSING
edwwVC.delegate = mainVC;

self.centerController = mainVC;
self.rightController = edwwVC;    
}

但是感谢你的帮助! :)欣赏它让我朝着正确的方向前进! :) 谢谢! :)