我正在尝试创建一个NSTimer
in Swift
但我遇到了一些麻烦.
NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)
test()
是同一个类中的函数.
我在编辑器中收到错误:
找不到接受提供的参数的'init'的重载
当我改变selector: test()
到selector: nil
错误消失.
我试过了:
selector: test()
selector: test
selector: Selector(test())
但没有任何作用,我在参考文献中找不到解决方案.
我用谷歌搜索,但无法找出快速等同于什么respondsToSelector:
.
这是我唯一能找到的东西(Swift替代respondsToSelector :)但在我的情况下并不太重要,因为它检查委托的存在,我没有委托我只想检查是否存在新的API或者不在设备上运行时,如果没有回到以前版本的api.
我想在NSObject实例上使用选择器,而不需要实现协议.例如,如果调用它的NSObject实例支持它,则应该设置一个类别方法.这是代码,代码按预期工作:
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器看不到setError:signature的任何方法,因此它为包含该@selector(setError:)
代码段的每一行提供了警告:
Undeclared selector 'setError:'
Run Code Online (Sandbox Code Playgroud)
我不想声明一个协议来摆脱这个警告,因为我不希望所有可能使用它的类实现任何特殊的东西.按惯例,我希望他们有setError:
方法或财产.
这可行吗?怎么样?
干杯,
EP
我创建了一个按钮,并为其添加了一个动作,但是一旦调用它,我就收到了这个错误:
-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
0x3d03ac0 2010-03-16 22:23:58.811
Money[8056:207] *** Terminating app
due to uncaught exception
'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0'
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];
numberButton.frame = CGRectMake(10, 435, 46, 38);
[numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
[numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview: numberButton];
}
return self;
}
-(IBAction)numberButtonClick:(id)sender{
NSLog(@"---");
}
Run Code Online (Sandbox Code Playgroud) 在MyClass.m中,我定义了
- (void) myTest: (NSString *) withAString{
NSLog(@"hi, %@", withAString);
}
Run Code Online (Sandbox Code Playgroud)
和MyClass.h中的适当声明.后来我打电话来
[self performSelector:@selector(mytest:withAString:) withObject: mystring];
Run Code Online (Sandbox Code Playgroud)
在MyClass.m但我得到一个类似于*终止应用程序的错误, 因为未捕获的异常'NSInvalidArgumentException',原因:'* - [MyClass myTest:withAtring:]:无法识别的选择器发送到实例0xe421f0'
我尝试了一个更简单的情况,一个选择器没有参数,打印一个字符串到控制台,并且工作得很好.代码有什么问题,我该如何解决?谢谢.
首先,我不确定我真的明白选择器是什么.根据我的理解,它是方法的名称,您可以将其分配给类型为"SEL"的类,然后运行诸如respondToSelector之类的方法来查看接收器是否实现了该方法.有人可以提供更好的解释吗?
其次,到目前为止,我有以下代码:
NSString *thing = @"Hello, this is Craig";
SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
NSLog(@"lowercaseString is: %@", [thing lowercaseString]);
Run Code Online (Sandbox Code Playgroud)
但是,即使thing
显然是一种NSString,并且应该响应lowercaseString,我也无法让'respondsToSelector'条件返回"YES"...
我仍然是Objective-C的新手,我想知道以下两个语句之间有什么区别?
[object performSelector:@selector(doSomething)];
[object doSomething];
Run Code Online (Sandbox Code Playgroud) 当你打电话时,是否有人知道是否有可能从事件堆栈或计时器堆栈(或API使用的任何机制)中取消已经排队的选择器事件performSelector:withObject:afterDelay
?
我正在使用此事件堆栈来更改TabBar选项卡中图像的属性,并且有时会在一个快速执行的循环中排队最多10秒的更改...可能是5毫秒左右.
如果用户切换选项卡,就会出现问题......比如说我已经为启用了选项卡#4后显示的图像排队了图像,然后用户快速切换到选项卡#3然后再转到选项卡#4 ......这将在旧队列仍在播放的同时重新排队另外10秒的改动,如果切换得足够快,可能在队列中大约2或3秒......但是甚至到达5秒钟到达队列流是一个问题.
所以我需要一些方法来取消旧的堆栈更改,然后再放置一个新的堆栈...
我用过去时态写这个查询是因为我已经通过在回放函数上添加一个鹰派事件过滤器来提出另一种解决这个问题的方法.但是如果可以取消活动,我仍然很好奇,因为我觉得这样的知识将来会派上用场.谢谢你提供的任何帮助:)
这是一个按钮选择器,当正常时它显示为红色,按下时它显示为灰色.
我想问一下如何进一步直接修改代码,以便在按下时文本大小和颜色也会发生变化?非常感谢!
<item android:state_pressed="true" >
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="2dp" android:color="@color/black" />
<solid android:color="@color/grey"/>
<padding android:left="5dp" android:top="2dp"
android:right="5dp" android:bottom="2dp" />
<corners android:radius="5dp" />
</shape>
</item>
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="2dp" android:color="@color/black" />
<solid android:color="#FF6699"/>
<padding android:left="5dp" android:top="2dp"
android:right="5dp" android:bottom="2dp" />
<corners android:radius="5dp" />
</shape>
</item>
Run Code Online (Sandbox Code Playgroud)
我是一个iOS新手.我有一个选择器方法如下 -
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现这样的东西 -
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误说 -
Instance method -performSelector:withObject:withObject:afterDelay: not found
Run Code Online (Sandbox Code Playgroud)
关于我缺少什么的任何想法?