【问题标题】:Why is my delegate becoming nil?为什么我的代表变成了零?
【发布时间】: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


【解决方案1】:

问题在于 CatViewController 嵌入在故事板的导航控制器中。因此 instantiateInitialViewController 没有返回 CatViewController,尽管屏幕上的一切看起来都很好。修复:

UINavigationController *navVC = [[UIStoryboard storyboardWithName:@"Cat" bundle:nil] instantiateInitialViewController];
CatViewController *catVC = navVC.viewControllers[0];
catVC.delegate = self;

【讨论】:

    【解决方案2】:

    你有:

    vc.delegate = self;
    

    无论self 是什么,它都会在你的新视图控制器的 viewDidLoad 被调用时被删除。为了验证这个理论,在该类中放置一个 dealloc 方法并在其中放置一个断点。

    【讨论】:

    • 我这样做了。我可以确认在创建 CatViewController 的类中没有调用 dealloc。
    【解决方案3】:

    您是否尝试像这样声明委托?

    @property (unsafe_unretained, nonatomic) id <CatViewControllerDelegate> delegate;
    

    【讨论】:

    • 为什么会更好!?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多