我正在努力制作一个自定义协议,希望有人可以提供帮助。
我有一个带有标签的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");
}
答案 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;
}
但是感谢你的帮助! :)欣赏它让我朝着正确的方向前进! :) 谢谢! :)