0

我正在尝试为我的自定义协议设置委托,该协议具有一个必需的方法,允许我将一组对象传递两个UITableViewControllers. 我的代表继续返回nil。因此,我需要的方法永远不会被调用。

我想知道我的数据源和委托实现UITableViewControllers是否导致冲突。此外,在声明代表时,也许 ARC 会妨碍您?

应该注意的是,两者UITableViewControllers都是使用 Storyboard 构建的,并使用 a 中的 segues 进行导航UINavigationController(不确定这是否会导致问题)。

导航是 --> AlarmViewController--> AlarmDetailsViewControllerAlarm我在我的对象中创建了一个AlarmDetailsViewController包含警报的所有详细信息的对象,将其放入一个数组中,我想将该数组传我的对象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

AlarmDetailsViewController.m

#import "AlarmDetailsViewController.h"

@interface AlarmDetailsViewController ()

@end

@implementation AlarmDetailsViewController

@synthesize passAlarmsArrayDelegate;

-(void) viewWillDisappear:(BOOL)animated
{
   NSLog(@"delegate = %@", self.passAlarmsArrayDelegate);  // This prints nil
   [[self passAlarmsArrayDelegate] passAlarmsArray:alarmsArray]; 
}
//....
@end

报警视图控制器.h

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

@property (nonatomic, retain) AlarmDetailsViewController *alarmDetailsViewController;

@end

报警视图控制器.m

#import "AlarmViewController.h"
#import "AlarmDetailsViewController.h"
#import "AlarmTableViewCell.h"
#import "Alarm.h"

@interface AlarmViewController ()

@end

@implementation AlarmViewController

@synthesize alarmDetailsViewController;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // This is where I'm attempting to set the delegate
    alarmDetailsViewController = [[AlarmDetailsViewController alloc]init];
    [alarmDetailsViewController setPassAlarmsArrayDelegate:self];
}

//....

//My @required protocol method which never gets called since my delegate is nil
-(void) passAlarmsArray:(NSMutableArray *)theAlarmsArray 
{
    alarmsTableArray = theAlarmsArray;
    NSLog(@"alarmsTableArray contains:  %@", alarmsTableArray); // Never gets called due to delegate being nil
    NSLog(@"theAlarmsArray contains:  %@", theAlarmsArray); // Never gets called due to delegate being nil
}

@end

我试图将委托设置为在 AlarmViewController 中按下按钮时触发的方法(与 viewDidLoad 方法相反),但这也不起作用。

我假设我在这里的某个地方出现了逻辑流错误。. . 但近 2 天的狩猎和重建并没有发现它。啊。

4

3 回答 3

1

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

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

您确实需要了解视图控制器的生命周期、实例化方式和时间,以及它们何时消失。这是 iOS 编程的核心,Apple 有大量关于它的文档。阅读 segues 也将非常有用。一个 segue(除了一个 unwind segue)总是实例化一个新的目标控制器实例。因此,当您执行 segue 时,无论是直接从按钮还是在代码中,都会实例化一个新的(与您直接分配初始化的不同)详细信息控制器。在执行该 segue 之前,调用 prepareForSegue: ,此时您可以访问将要创建的那个。这是设置委托或将任何信息传递给目标视图控制器的地方。

于 2013-02-02T07:09:24.657 回答
0

自从您使用 ARC 以来,您是否尝试将 (nonatomic, retain) 替换为 (nonatomic, strong)?

于 2013-02-01T22:26:20.163 回答
0

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

只需删除您的alarmDetailsViewController ivar 并使用@property,最好通过self.alarmDetailsViewController。

于 2013-02-01T22:26:36.210 回答