我正在为UIToolbar创建子类,因为我将在我的应用程序中重复使用它.UIToolbar使用委托协议:
//
// UIToolbarCustom.h
//
#import <UIKit/UIKit.h>
@protocol UIToolbarCustomDelegate
@required
- (void)tab:(UIBarButtonItem *)sender;
- (void)ok:(UIBarButtonItem *)sender;
@end
@interface UIToolbarCustom : UIToolbar {
id <UIToolbarCustomDelegate> delegate;
}
@property (strong, nonatomic) id delegate;
@end
Run Code Online (Sandbox Code Playgroud)
Standford iOS开发课程老师建议明确声明所有ivars前缀为下划线,如:
@implementation UIToolbarCustom
@synthesize delegate = _delegate;
@end
Run Code Online (Sandbox Code Playgroud)
但是,在这个指定scenarion它给我一个错误:
error: property 'delegate' attempting to use ivar '_delegate'...
Run Code Online (Sandbox Code Playgroud)
如果我使用以下代码就可以了:
@synthesize delegate = __delegate; or
@synthesize delegate;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?UIToolbar类中是否有一个名为_delegate的私有实例变量?
UPDATE
感谢所有人的澄清和说明,我学到了很多东西.事实证明我是iOS开发的新手(这是我的第一个应用程序第二版,所以我正在努力做到正确= p).按照提示我出来了这个新的头文件:
//
// Toolbar.h
//
#import <UIKit/UIKit.h>
@protocol ToolbarDelegate
@required
- (void)tab:(UIBarButtonItem *)sender;
- (void)ok:(UIBarButtonItem *)sender;
@end
@interface Toolbar : UIToolbar
@property (strong, nonatomic) id delegate;
@end
Run Code Online (Sandbox Code Playgroud)
笔记:
类前缀已删除.
委托声明已被删除(我使用的是ios委托教程代码,但代码示例使用较旧的xcode版本,需要声明).
合成被删除了,我也不知道我们不再需要合成我们的属性了.
PS:显然代码不起作用,因为ivar问题.我要更改它的名字,所以我不需要合成它,不知道要使用什么名称...
这里发生了什么?UIToolbar类中是否有一个名为_delegate的私有实例变量?
是的,这正是问题所在.您需要为实例变量提供不同的名称.__delegate将起作用,或者您可以在名称前加上3个字母的前缀(参见最后一段).
请注意,您已将ivar声明为delegate,然后在synthesize语句中告诉编译器使用_delegate.实际上,这意味着您的delegateivar根本就没有被使用.无论如何,如果您正在为iOS编写(而不是32位Mac),就像您一样,在子类的@interface部分中不需要显式的实例变量声明,因为编译器会自动为它创建它您.
最后,将自己的子类命名为以'UI'开头的形式是不好的,因为UI前缀是为属于UIKit的类保留的.您应该使用自己的3个字母前缀,否则根本没有前缀.问题是,UIKit的未来版本可能包含一个名为"UIToolbarCustom"的类,您的子类将与它发生冲突.
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |