【问题标题】:protocol method is not being called by the delegate object委托对象未调用协议方法
【发布时间】:2012-03-13 01:37:21
【问题描述】:

另一个没有调用协议方法的情况 - 不知道我在这里做错了什么......

这里是代码,省略了不必要的信息...

第一个头文件:AccessNumber.h

@protocol AddItemDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;
@end

@interface AccessNumber : UIViewController <UITableViewDelegate, UITableViewDataSource, ABPeoplePickerNavigationControllerDelegate, UIAlertViewDelegate> {

id <AddItemDelegate> delegate;

}
@property (retain) id <AddItemDelegate> delegate;
@end

第一个 .m 文件:AccessNumber.m - 我从 viewdidload 调用协议方法只是为了测试目的,它基本上应该从另一个方法调用,但为了这个 convo 也是一样的(当然都试过了)

#import "AccessNumber.h"
#import "History.h"

@synthesize delegate;

- (void)viewDidLoad
{
         [super viewDidLoad];

....

     [[self delegate] processSuccessful:YES];
}

第二个文件头:History.h

@interface History : UIViewController <UITableViewDelegate, UITableViewDataSource, AddItemDelegate> {
 ....
    }

history.m中的方法实现

- (void) processSuccessful: (BOOL)success {

NSLog(@"SUCCESS");
}

感谢任何帮助。谢谢!

【问题讨论】:

    标签: iphone objective-c ios xcode delegates


    【解决方案1】:

    在代码中我没有看到类似的内容:

    theAccessNumber.delegate = self;
    

    您必须将 History 实例设置为 AccessNumber 实例的委托属性。

    问候。

    【讨论】:

    • 我发布的代码应该在 History.m 中的某个位置,可能在 init 或 viewDidLoad,这取决于你。
    【解决方案2】:

    代码看起来有点滑稽,但你没有告诉你的“AccessNumber”类谁是他的代表,即使你正在让“History”类实现你自己建立的协议(否则你会得到一个警告)。

    在“AccessNumber.m”中设置“AccessNumber”类时,您必须像这样设置委托:

    self.delegate = historyInstance;
    

    或者在“History.m”中设置时像这样:

    accessNumberInstance.delegate = self;
    

    【讨论】:

      【解决方案3】:

      在很多情况下你应该保留一个委托,通常你的委托会比对象更长寿。因此,将您的属性从保留更改为分配。并确保您正在设置委托。你在哪里做?如果你的对象真的依赖它,你应该在构造函数(iniWithDelagate)中传递它。在调用 delagate 方法之前尝试做一个 NSLog,看看它是否不是 nil。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多