【发布时间】:2014-10-25 00:17:39
【问题描述】:
我已经完成了这种委托模式一百万次。在我获得 nil 代表的第一百万次中:
CatViewController *vc = [[UIStoryboard storyboardWithName:@"Cat" bundle:nil] instantiateInitialViewController];
vc.delegate = self;
[self presentViewController:vc animated:YES completion:^{
DDLogWarn(@"[%@ %@] delegate: %@", THIS_FILE, THIS_METHOD, vc.delegate); //here the delegate is valid
}];
@protocol CatViewControllerDelegate;
@interface CatViewController : UIViewController
@property (weak, nonatomic) id <CatViewControllerDelegate> delegate;
@end
@protocol CatViewControllerDelegate <NSObject>
@required
- (void)catViewController:(CatViewController*)catVC didFinishWithSuccess:(BOOL)success;
@end
但是,在 CatViewController 的 viewDidLoad 中,self.delegate 已经是 nil,当我尝试这样做时当然是 nil:
[self.delegate catViewController:self didFinishWithSuccess:YES];
为什么 catViewController 的委托变成了 nil?
【问题讨论】:
-
您是否在其他任何地方修改了委托?如果没有,我认为必须释放委托实例。
-
我相信 viewDidLoad 在您实例化初始视图控制器之后但在您设置委托之前被调用。您可以通过将字符串放在 viewdidLoad: 中然后将字符串放在 setDelegate: 中来测试这个理论,并检查哪个首先被调用。我建议,由于您很早就尝试使用委托,因此您可能需要创建一个 initWithDelegate: 方法。
-
另外,当您从情节提要中获取视图时,它会自动加载视图...这意味着视图将在您获得对 Viewcontroller 的引用时被加载,因此 viewDidLoad: 将是已经打电话了。
-
在按下按钮之前,我实际上并没有使用代理。但它在 viewDidLoad 中已经为零。
标签: ios objective-c uiviewcontroller delegates protocols