Ios 无法使用ARC和两个UITableViewController(使用UINavigationController)设置自定义协议委托

Ios 无法使用ARC和两个UITableViewController(使用UINavigationController)设置自定义协议委托,ios,objective-c,Ios,Objective C,我正在尝试为自定义协议设置委托,该协议有一个必需的方法,允许我在两个UITableViewControllers的层次结构中向后传递一个对象数组。我的委托继续返回nil。因此,从未调用我所需的方法 我想知道我的UITableViewControllers的数据源和委托实现是否导致冲突。另外,在声明委托时,ARC是否也会成为障碍 应该注意的是,UITableViewControllers都是使用情节提要构建的,并且使用uinavigationcontrollers中的分段进行导航(不确定这是否会导

我正在尝试为自定义协议设置委托,该协议有一个必需的方法,允许我在两个
UITableViewControllers
的层次结构中向后传递一个对象数组。我的委托继续返回
nil
。因此,从未调用我所需的方法

我想知道我的
UITableViewControllers
的数据源和委托实现是否导致冲突。另外,在声明委托时,ARC是否也会成为障碍

应该注意的是,
UITableViewControllers
都是使用情节提要构建的,并且使用
uinavigationcontrollers
中的分段进行导航(不确定这是否会导致问题)

导航为-->
AlarmViewController
-->
AlarmDetailsViewController
。我在我的
AlarmDetailsViewController
中创建一个
Alarm
对象,该对象包含报警的所有详细信息,将其放入一个数组中,然后我希望将该数组返回到我的
AlarmViewController
,以在表中的自定义单元格中显示

注意:我想在这里使用委托模式。我对调用
NSNotifications
或使用我的
AppDelegate
类的解决方案不感兴趣

AlarmDetailsViewController.h

#import "Alarm.h"

@protocol PassAlarmArray <NSObject>
   @required
   -(void) passAlarmsArray:(NSMutableArray *)theAlarmsArray;
@end

@interface AlarmDetailsViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> 
{
   //.....   
   id <PassAlarmArray> passAlarmsArrayDelegate;   
}

@property (nonatomic, retain) id <PassAlarmArray> passAlarmsArrayDelegate;

@end
@interface AlarmViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, PassAlarmArray>
{
//...
AlarmDetailsViewController  *alarmDetailsViewController;
}

@property (nonatomic, retain) AlarmDetailsViewController *alarmDetailsViewController;

@end
AlarmViewController.h

#import "Alarm.h"

@protocol PassAlarmArray <NSObject>
   @required
   -(void) passAlarmsArray:(NSMutableArray *)theAlarmsArray;
@end

@interface AlarmDetailsViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> 
{
   //.....   
   id <PassAlarmArray> passAlarmsArrayDelegate;   
}

@property (nonatomic, retain) id <PassAlarmArray> passAlarmsArrayDelegate;

@end
@interface AlarmViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, PassAlarmArray>
{
//...
AlarmDetailsViewController  *alarmDetailsViewController;
}

@property (nonatomic, retain) AlarmDetailsViewController *alarmDetailsViewController;

@end
我尝试在AlarmViewController中按下按钮时触发的方法(与viewDidLoad方法相反)中设置委托,但该方法也不起作用


我假设我这里有个逻辑流错误。但经过近两天的捕猎和重建,还没有发现它。呃。

由于使用ARC,您是否尝试将(非原子,保留)替换为(非原子,强)?

自动合成的属性,如alarmDetailsViewController属性,具有带下划线前缀的支持IVAR,例如_alarmDetailsViewController。alarmDetailsViewController ivar(AlarmViewController.h中@interface…{}块内声明的alarmDetailsViewController)与alarmDetailsViewController属性的支持ivar不同


只需删除alarmDetailsViewController ivar并使用@属性,最好是通过self.alarmDetailsViewController。

您将代理设置在错误的位置,并且在控制器的不同实例上,而不是在执行该步骤时获得的实例上。如果要从AlarmViewController推送AlarmDetailsViewController,则应在PrepareForsgue方法中设置委托

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    AlarmDetailsViewController *alarm = segue.destinationViewController;
    alarm.passAlarmsArrayDelegate = self;
}

您确实需要了解视图控制器的生命周期,如何实例化视图控制器,何时实例化视图控制器,以及视图控制器何时消失。这是iOS编程的核心,苹果公司有大量的相关文档。阅读segues也会非常有用。segue(除展开segue外)始终实例化目标控制器的新实例。因此,当执行segue时,无论是直接从按钮还是在代码中,都会实例化一个新的(不同于您直接分配init的)细节控制器。在执行该segue之前,将调用prepareforsgue:,此时您可以访问即将创建的segue。这是设置代理或将任何信息传递给目标视图控制器的地方。

我对你的建议不太感兴趣。我已经在接口块中删除了alarmDetailsViewController声明,保留了属性并删除了@synthesis in.m。我将委托的声明更改为self.alarmDetailsViewController,但未成功。让我知道我是否做了你建议的正确更改。我做了,但没有成功。我还尝试了
,但没有效果。您提到了self.passalarmsaraydelegate在viewwilldesign中为零。它在ViewWillDisplay中是否也为nil?是的,它在ViewWillDisplay和ViewWillEnglish中均为
nil。如果使用
@synthetic alarmDetailsViewController=alarmDetailsViewController更新代码,情况是否相同?这起作用了,这是我想要的正确设置代理的答案。谢谢你对segues的建议。