Ios 委托方法可以';不要引用自己的类

Ios 委托方法可以';不要引用自己的类,ios,objective-c,Ios,Objective C,我有一个名为NumberPickerView的UIView子类。我正在为它编写一个委托方法。编译器不允许我将NumberPickerView的实例作为该方法中的参数传递。我错过了什么 @protocol NumberPickerViewDelegate -(void) numberPickerDidChangeSelection:(NumberPickerView *)numberPickerView; //error: expected a type @end @interface N

我有一个名为NumberPickerView的UIView子类。我正在为它编写一个委托方法。编译器不允许我将NumberPickerView的实例作为该方法中的参数传递。我错过了什么

@protocol NumberPickerViewDelegate

-(void) numberPickerDidChangeSelection:(NumberPickerView *)numberPickerView;
//error: expected a type

@end


@interface NumberPickerView : UIView <UIScrollViewDelegate> {
     id <NumberPickerViewDelegate> delegate;
}
@协议编号PickerViewDelegate
-(无效)numberPickerDidChangeSelection:(NumberPickerView*)NumberPickerView;
//错误:应为类型
@结束
@接口编号PickerView:UIView{
id代表;
}

实际上它可以。此时,编译器不知道
NumberPickerView

@class NumberPickerView;
通过协议声明添加它,让编译器知道该类。。。它被称为
转发声明

为了更好地理解,请查看以下内容:

将协议声明移动到类
NumberPickerView
定义下方,但在这种情况下,还应在顶部添加:

@protocol NumberPickerViewDelegate;

不使用iddelegate获取警告实际上它可以。此时,编译器不知道
NumberPickerView

@class NumberPickerView;
通过协议声明添加它,让编译器知道该类。。。它被称为
转发声明

为了更好地理解,请查看以下内容:

将协议声明移动到类
NumberPickerView
定义下方,但在这种情况下,还应在顶部添加:

@protocol NumberPickerViewDelegate;

要使用iddelegate获得警告,您可以将参数类型更改为id,而不是NumberPickerView*,并在后面传递任何类对象,如下所示

@protocol NumberPickerViewDelegate

-(void) numberPickerDidChangeSelection:(id)numberPickerView;

@end


@interface NumberPickerView : UIView <UIScrollViewDelegate> {
     id <NumberPickerViewDelegate> delegate;
}
@协议编号PickerViewDelegate
-(无效)numberPickerDidChangeSelection:(id)numberPickerView;
@结束
@接口编号PickerView:UIView{
id代表;
}

您可以将参数类型更改为id,而不是NumberPickerView*,并将任何类对象的后缀作为以下内容传递

@protocol NumberPickerViewDelegate

-(void) numberPickerDidChangeSelection:(id)numberPickerView;

@end


@interface NumberPickerView : UIView <UIScrollViewDelegate> {
     id <NumberPickerViewDelegate> delegate;
}
@协议编号PickerViewDelegate
-(无效)numberPickerDidChangeSelection:(id)numberPickerView;
@结束
@接口编号PickerView:UIView{
id代表;
}

是的,这将编译。但是编译器将不再检测到“错误的委托”,并在以后导致运行时异常。是的,这将编译。但编译器将不再检测到“错误的委托”,并在以后导致运行时异常。Injectios答案是目前为止最正确的解决方案。话虽如此,numberPickerDidChangeSelection:有多有用?不会
numberPicker:(NumberPickerView*)NumberPickerView改变选择:(id)选择
(其中,
id
被代表选择的内容替换)是否更有用?即使是将
更改为
的单独参数也可能有用。可能吧,但我并不需要知道更改时的值—只需要知道更改了哪个选择器。在我当前的实现中,NumberPickerView有一个value属性,并且屏幕上同时有几个属性。我直接从它的属性中获取选择器的值,在我需要它的时候,所以只需要知道哪一个已经更改。您的实现也会起作用。Injectios答案是目前为止最正确的解决方案。话虽如此,numberPickerDidChangeSelection:有多有用?不会
numberPicker:(NumberPickerView*)NumberPickerView改变选择:(id)选择
(其中,
id
被代表选择的内容替换)是否更有用?即使是将
更改为
的单独参数也可能有用。可能吧,但我并不需要知道更改时的值—只需要知道更改了哪个选择器。在我当前的实现中,NumberPickerView有一个value属性,并且屏幕上同时有几个属性。我直接从它的属性中获取选择器的值,在我需要它的时候,所以只需要知道哪一个已经更改。您的实现也会起作用。回答得很好。谢谢,回答得很好。非常感谢。