- (void)someMethod
{
if ( [delegate respondsToSelector:@selector(operationShouldProceed)] )
{
if ( [delegate operationShouldProceed] )
{
// do something appropriate
}
}
}
Run Code Online (Sandbox Code Playgroud)
该文件说:
只有正式协议中的可选方法或非正式协议的方法才需要采取预防措施
这是什么意思?如果我使用正式的协议,我可以使用[delegate myMethod]?
我需要帮助调试我的课程.我收到一个如此奇怪的错误,以至于我找不到任何类似的东西,所以我只是放下我的大部分代码.
//Tab.h
#import <UIKit/UIKit.h>
@class Tab;
@protocol TabDelegateDataSource <NSObject>
@required
-(void)removeTab:(Tab *)tab;
@end
@interface Tab : UIView
{
id <TabDelegateDataSource> __strong _delegate;
}
@property(strong) id <TabDelegateDataSource> delegate;
-(void)removeTab;
@end
// Tab.m
#import "Tab.h"
@implementation Tab
@synthesize delegate = _delegate;
-(void)removeTab
{
[self.delegate removeTab:self];//Error here saying: No known instance method for selector 'removeTab:'
}
@end
Run Code Online (Sandbox Code Playgroud) 我是Cocoa编程的新品牌,我仍然对事物如何连接感到困惑.
我需要一个非常简单的应用程序,DoStuff只要点击窗口上的任何一点,它就会触发一个命令(让我们调用它).经过一些研究后,看起来子类化NSView是正确的方法.我的ClickerView.m文件有这个:
- (void)mouseDown:(NSEvent *)theEvent {
NSLog(@"mouse down");
}
Run Code Online (Sandbox Code Playgroud)
我已经将视图添加到窗口并使其在整个事物中延伸,并且每次单击窗口时都正确地写入日志.
我的doStuff控制器上也有我的方法(这可以重构为我自己的类,但是现在它可以工作):
- (IBAction)doStuff:(id)sender {
// do stuff here
}
Run Code Online (Sandbox Code Playgroud)
所以,我如何才能mouseDown在ClickerView能够调用DoStuff控制器?我有一个强大的.NET背景,有了这个,我只在ClickerView中有一个自定义事件,Controller会消耗; 我只是不知道如何在Cocoa中做到这一点.
根据Joshua Nozzi的建议编辑
我IBOutlet在我的View中添加了一个(并将其更改为子类NSControl):
@interface ClickerView : NSControl {
IBOutlet BoothController *controller;
}
@end
Run Code Online (Sandbox Code Playgroud)
我通过单击并从controllerView上的Outlets面板中的项目拖动到控制器,将控制器连接到它.我的mouseDown方法现在看起来像:
- (void)mouseDown:(NSEvent *)theEvent {
NSLog(@"mouse down");
[controller start:self];
}
Run Code Online (Sandbox Code Playgroud)
但是控制器没有实例化,调试器将其列为0x0,并且不发送消息.