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的建议。