【问题标题】:Properly declare delegation in Objective C (iPhone)在 Objective C (iPhone) 中正确声明委托
【发布时间】:2011-02-13 11:21:28
【问题描述】:

好的,这已经解释了好几次了(我大部分都使用this post on SO),但我遗漏了一些东西。我能够干净地编译,并且能够设置委托以及从委托调用方法,但我在构建时收到警告:

No definition of protocol 'DetailViewControllerDelegate' is found

我只有一个 DetailViewController 和一个 RootViewController。我正在从 DetailViewController 调用 RootViewController 中的方法。我的委托是这样设置的:

RootViewController.h:

#import "DetailViewController.h"

@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate, DetailViewControllerDelegate> //Error shows up here
{
//Some Stuff Here
}
//Some other stuff here
@end

RootViewController.m 中,我在使用detailViewController.delegate = self 创建视图时定义了委托

DetailViewController.h:

@protocol DetailViewControllerDelegate;

#import "RootViewController.h"

@interface DetailViewController : UITableViewController <UITextFieldDelegate>
{
    id <DetailViewControllerDelegate> delegate;
}

@property (nonatomic, assign) id <DetailViewControllerDelegate> delegate;

@end

@protocol DetailViewControllerDelegate

//some methods that reside in RootViewController.m

@end

我对在DetailViewController.h 中的导入上方声明协议感到很奇怪,但如果我不这样做,它就不会构建。就像我说的那样,这些方法被称为很好,并且没有其他错误发生。我在这里错过了什么?

【问题讨论】:

    标签: iphone objective-c delegates methods


    【解决方案1】:

    这是解决此问题的另一种方法,类似于 deanWombourne 提出的解决方案。

    @protocol DetailViewControllerDelegate;
    
    @interface DetailViewController : UITableViewController <UITextFieldDelegate> {
        id <DetailViewControllerDelegate> delegate;
    }
    
    @property (nonatomic, assign) id <DetailViewControllerDelegate> delegate;
    
    @end
    
    @protocol DetailViewControllerDelegate <NSObject>
    - (void) controller:(DetailViewController *)controller hasSomething:(id)thing;
    @end
    

    【讨论】:

      【解决方案2】:

      pheelicks 几乎在那里,但看起来你的一些协议方法也使用DetailViewController 类,我想它看起来像这样:

      @protocol DetailViewControllerDelegate <NSObject>
      - (void) controller:(DetailViewController *)controller hasSomething:(id)thing;
      @end
      
      @class DetailViewController : UITableViewController <UITextFieldDelegate> {
          id <DetailViewControllerDelegate> delegate;
      }
      @property (nonatomic, assign) id <DetailViewControllerDelegate> delegate;
      @end
      

      你还没有定义DetailViewController,所以你会在协议定义中得到一个错误。

      您可以通过两种方式解决此问题:

      a) 在协议之前声明(但尚未定义)类

      @class DetailViewController;
      
      @protocol DetailViewControllerDelegate <NSObject>
      - (void) controller:(DetailViewController *)controller hasSomething:(id)thing;
      @end
      

      b) 只需在您的协议方法中使用 UITableViewController 而不是 DetailViewController

      @protocol DetailViewControllerDelegate <NSObject>
      - (void) controller:(UITableViewController *)controller hasSomething:(id)thing;
      @end
      

      就个人而言,我选择解决方案 (a),但这实际上取决于您要做什么。

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        试试:

        在 DetailViewController.h 中:

        #import "RootViewController.h"    
        
        @protocol DetailViewControllerDelegate <NSObject>
        
        //some methods that reside in RootViewController.m
        
        @end
        
        @interface DetailViewController : UITableViewController <UITextFieldDelegate>
        {
          id <DetailViewControllerDelegate> delegate;
        }
        
        @property (nonatomic, assign) id <DetailViewControllerDelegate> delegate;
        
        @end
        

        【讨论】:

        • 当我这样做时,我最终会在构建方法中遇到错误。所以我得到Expected ')' before DetailViewController。该方法没有任何拼写错误。 -编辑添加-虽然它确实消除了警告。
        • 尝试将导入移到协议之前(请参阅更新的答案)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多