将自身作为上下文传递给WatchKit中的presentControllerWithNames

时间:2014-11-25 20:25:48

标签: objective-c watchkit

在我的演示界面控制器中,我有以下代码:

- (IBAction)showModal {
    NSArray *namesArray = @[@"A", @"B", @"C"];
    NSArray *contextsArray = @[self, self, self];
    [self presentControllerWithNames:namesArray contexts:contextsArray];
}

我想做的是,在我的模态分页接口控制器的每个页面上将传递的上下文设置为委托属性,如下所示:

#import "ModalPageInterfaceController.h"

@interface ModalPageInterfaceController ()

@property (nonatomic, weak) id delegate;

@end

@implementation ModalPageInterfaceController

- (instancetype)initWithContext:(id)context {
    self = [super initWithContext:context];
    if (self) {
        self.delegate = context;
    }
    return self;
}

@end

但是我发现,除了调用initWithContext:时的第一页,所有语境都是nil,因此我无法为这些页面设置我的委托属性。我做错了什么,或者这只是一个WatchKit错误?

3 个答案:

答案 0 :(得分:1)

我意识到这是前一段时间的问题,但值得发布一个解决方案。

我相信这是Beta 3及更早版本中的WatchKit错误。

我发现它的唯一方法是在数组中传递参数。

[self presentControllerWithNames:@[@"First", @"Second", @"Third"],
    contexts:@[@[self], @[@0, self], @[@0, @1, self]]];

它似乎只是根除了重复的背景,所以它们需要不同。我的接口控制器代码已设置为检查上下文是否为数组并枚举以查找第一个非NSNumber实例。

This Apple dev forums post解释了相同的解决方案,后续消息表明此问题已在Beta 4中修复。

答案 1 :(得分:0)

您对原始上下文持有弱引用。也许它正在被解除分配?尝试:

@property (nonatomic, strong) id delegate;

答案 2 :(得分:0)

Swift:使用awakeWithContext

呼叫者:

self.presentControllerWithName("name", context: self)

被叫方:

var delegate:AnyObject? = nil
    override func awakeWithContext(context: AnyObject?) {
        self.delegate = context
    }