iPhone setDelegate 到先前分配的对象

Posted

技术标签:

【中文标题】iPhone setDelegate 到先前分配的对象【英文标题】:iPhone setDelegate to a previously allocated object 【发布时间】:2011-08-05 12:30:28 【问题描述】:

我正在尝试设置协议和委派。

我有一个问题,我希望为之前分配的对象设置一个委托。

我分配的对象需要委托给一个协议。这是怎么做到的?

这是我的代码。

//SendSMS.h

@protocol ModalViewDelegate

- (void)didReceiveMessage:(NSString *)message;

@end

@interface SendSMS : UIViewController <UITextViewDelegate, UITextFieldDelegate> 


    MessageOptions *messageOptions;
    LoginPage *loginPage;
    IBOutlet UITextField *phonenumber;
    IBOutlet UITextView *smsBody;
    IBOutlet UIScrollView *scrollview;



-(IBAction)LoadMessageOptions;

@end

问题是当对象被压入堆栈时。它的代表不是它自己的代表。但它之前的对象。

有什么想法吗?

更新!

好的,我已设法将我的委托设置为 [self.navigationController.viewControllers objectAtIndex:0],这是 rootviewcontroller。但是我有 3 个编译器警告,指出协议中没有这些方法。它们是什么......但它编译运行并工作。

【问题讨论】:

在您创建它的类中,您可以将委托分配为实现协议的对象。检查iprav.in/?p=57 我做到了,但它将委托设置为自我。我不能委托给自我,因为我有 3 个视图并且希望视图 3 将数据传递给视图 1。如果我可以跳过它两次传递给 self 是没有意义的,这就是我所做的,但让控制器位于方法从堆栈中设置。 如果您有对 view1 或其控制器的引用,那么在您创建 view3 时将委托分配给该引用。 【参考方案1】:

永远不要让实例将委托设置为自己。代表的整个想法是您不需要知道代表是谁。据我了解,您的架构分为三个层次;

    View1 是根控制器,它创建和推送; View2 做一些事情然后创建和推送; View3 想要将一些结果发送给相关人员。

我看到了两种可能的解决方案。

解决方案 1 - 代表

    View3 声明一个委托协议View3Delegate。 让View1符合View3Delegate。 当View1 创建并推送View2 时,还将它传递给self 以保持。 当View2 创建并推送View3 时,还要设置在第3 步中传递的委托。 当View3 想要发送它的结果时,打电话给代表并高兴。

解决方案 2 - 通知

在您的情况下,这可能是一个更优雅的解决方案,因为以前的解决方案有一个额外的步骤,View2 需要处理一些东西只是为了使View1View3 工作,与它的实际职责无关.

    View3 声明一个名为View3ResponseNotification 的通知。 让View1 观察名称View3ResponseNotification 的通知。 View1 创建和推送 View2 无后顾之忧。 View2 创建和推送View3 无后顾之忧。 当View3 想要发送结果时,它会发布View3ResponseNotification 通知。

【讨论】:

我会给你打勾。这是我想这样做的方式,但我认为它有点冗长。因此,当视图 2 推送视图 3 时,它会将委托设置到堆栈中索引:0 处的视图控制器。它真的很好用。我上面遇到的问题是另一个 xcode 问题,简单的重启就停止了编译器警告。

以上是关于iPhone setDelegate 到先前分配的对象的主要内容,如果未能解决你的问题,请参考以下文章

先前排名为零时如何分配排名(第 2 部分)

如何根据先前的行为预测系统的行为

这个方法叫啥:[NSPathStore2 setDelegate:]

setDelegate 上的语义问题

在 Interface Builder 中设置委托与使用 setDelegate: 有啥区别?

是否将 Closeable 的新实例分配给先前创建的实例,关闭先前的实例?