根据iOS文档,响应者链用于"向上传递"触摸事件.它也用于控件生成的操作.精细.
我真正想做的是发送自定义事件"上链".接收事件的第一响应者将处理它.这似乎是一个非常常见的模式,但我找不到任何关于如何做到"iOS/Cocoa方式"的好解释.
由于响应链正是我所需要的,我提出了这样的解决方案:
// some event happened in my view that
// I want to turn into a custom event and pass it "up":
UIResponder *responder = [self nextResponder];
while (responder) {
if ([responder conformsToProtocol:@protocol(ItemSelectedDelegate)]) {
[responder itemSelected:someItem];
break;
}
responder = [responder nextResponder];
}
Run Code Online (Sandbox Code Playgroud)
这很有效,但我觉得应该有其他方法来处理这个问题.手动走链子这种方式似乎不太好......
请注意,通知在这里不是一个好的解决方案,因为我只希望参与视图层次结构中的对象,并且通知是全局的.
在iOS中处理这个问题的最佳方法是什么(和Cocoa一样)?
编辑:
我想要完成什么?
我有一个视图控制器,它有一个视图,有子视图等...几个子视图是一个特定类型,显示数据库中的项目.当用户点击此视图时,应将信号发送到控制器以导航到此项目的详细信息页面.
处理点击的视图位于视图层次结构中主视图下方的几个级别.我必须告诉控制器(或在某些情况下,特定的子视图"向上链")选择了一个项目.
听通知是一种选择,但我不喜欢这种解决方案,因为选择一个项目不是全局事件.它严格依赖于当前的视图控制器.
我创造了一个 UIActionSheet
UIActionSheet * action = [[UIActionSheet alloc]initWithTitle:@""
delegate:self
cancelButtonTitle: @"cancel"
destructiveButtonTitle: @"OK"
otherButtonTitles: nil];
[action showInView:self.view];
[action release];
Run Code Online (Sandbox Code Playgroud)
在取消按钮的事件中,UIActionSheet我想要触发一个事件UIBarButtonItem,这在我看来.
我的问题是如何在UIActionSheet委托方法中触发按钮事件(不触摸按钮)
从OS X 10.10开始,大部分NSStatusItem都被弃用,而不是该button属性,该属性由NSStatusBarButton组成.它应该像普通按钮一样工作,但遗憾的是NSStatusButton中的cell和setCell方法也已被弃用.由于这个原因,我很难找到一种方法来保持按钮在点击后突出显示(通常按钮在鼠标按下时突出显示,在鼠标向上突出显示.我希望在鼠标按下后保持按钮突出显示).
调用[NSStatusButton setHighlighted:]它的动作不起作用,因为一旦鼠标启动它似乎不会自动亮起.另一方面,使用延迟在下一个循环中调用它,即使[self performSelector: withDelay:]突出显示以相当难看的方式闪烁.它有效,但看起来不太好.
设置按钮类型以NSToggleButton完全删除突出显示,而是突出显示奇怪的模板图像.
这是我能想到的唯一方法.反正有没有覆盖这个NSButtonCell mouseUp行为?
我收到了警告
PerformSelector可能导致泄漏,因为其选择器未知
在代码中:
- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
assert([NSThread isMainThread]);
if([delegate respondsToSelector: selector])
{
if(arg != NULL)
{
//this line the warning
[delegate performSelector: selector
withObject: arg
withObject: err];
}
else
{
//this line the warning
[delegate performSelector: selector
withObject: err];
}
}
else
{
NSLog(@"Missed Method");
}
}
Run Code Online (Sandbox Code Playgroud)
标题:
@interface Topscore : UIViewController <NSObject> {
//
}
Run Code Online (Sandbox Code Playgroud) 这是SO中已经回答的问题,但我无法在Apple文档中找到它.你能指出我正确的方向吗?
在以下主题中
在将对象传递给-performSelector之前,我是否必须保留一个对象:withObject:afterDelay:?
对performSelector的保留计数的影响:withObject:afterDelay:inModes
是调用performSelector的对象:withObject:afterDelay是否被NSRunLoop保留?
默认行为似乎如下:它保留接收器和参数.
我正在使用以下代码
[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];
Run Code Online (Sandbox Code Playgroud)
哪里userData是自动释放的对象.
记录保留计数(我知道它可能无效)传入的数据会增加其保留计数.在委托上调用方法时,保留计数不等于1.
所以,我的问题是:我是否需要执行一些内存管理以避免泄漏或者我是否必须相信Apple的东西?在这里,我作为一个不可知论者说话,因为我找不到合适的文档.
先感谢您.
memory-management objective-c retain nsobject performselector
所以我有一个应用程序,它触发一系列异步事件,然后将结果写入缓冲区.问题是我希望缓冲区同步写入(在产生异步进程的线程中)
骨架代码就是这样
let Session = NSURLSession.sharedSession()
let TheStack = [Structure]()
//This gets called asynchronously, e.g. in threads 3,4,5,6,7
func AddToStack(The Response) -> Void {
TheStack.insertAt(Structure(The Response), atIndex: 0))
if output.hasSpaceAvailable == true {
// This causes the stream event to be fired on mutliple threads
// This is what I want to call back into the original thread, e.g. in thread 2
self.stream(self.output, handleEvent: NSStreamEvent.hasSpaceAvailable)
}
}
// This is in the main loop, e.g. thread 2
func stream(aStream: NSStream, …Run Code Online (Sandbox Code Playgroud) 我第一次使用Xcode时,我在线学习了一个教程.我按照教程向我展示了所有内容,但我担心它已经过时了.
我遇到的错误是:
[font_attributes release];
Run Code Online (Sandbox Code Playgroud)
'release'不可用:在自动参考计数模式下不可用
ARC禁止"发布"的显式消息发送
我对Cocoa和Xcode的了解有限,但我仍然希望扩展我的学习.
我该如何解决这个ARC问题?
我在非ARC中使用此代码,无错误或警告:
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
{
// Only care about value changed controlEvent
_target = target;
_action = action;
}
- (void)setValue:(float)value
{
if (value > _maximumValue)
{
value = _maximumValue;
} else if (value < _minimumValue){
value = _minimumValue;
}
// Check range
if (value <= _maximumValue & value >= _minimumValue)
{
_value = value;
// Rotate knob to proper angle
rotation = [self calculateAngleForValue:_value];
// Rotate image
thumbImageView.transform = CGAffineTransformMakeRotation(rotation);
}
if (continuous)
{
[_target performSelector:_action …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用第三方SDK的iPad项目,并且已经阅读了SDK代码以了解它和objective-c.我在异步回调中遇到了以下行:
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];
Run Code Online (Sandbox Code Playgroud)
指定延迟0不一定会导致选择器立即执行.选择器仍在线程的运行循环中排队,并尽快执行.
我不能确定为什么要写[self performSelector:@selector(doSomething) withObject:nil afterDelay:0],而不是仅仅写作[self doSomething].在我看来,延迟为零意味着应该立即进行呼叫.显然我遗漏了一些东西,框架作者不太可能随意选择这种方法.其他StackOverflow答案也没有说明这一点.是否使用了"performSelector"选择器,因为doSomething选择器本身是异步的,并且调用是在异步回调中进行的?
有趣的是,使用performSelector和afterDelay也会让警告[即,编译器警告]消失:...
[self performSelector:aSelector withObject:nil afterDelay:0.0];
那么作者是否使用此代码仅抑制编译器警告?如果是这种情况,则可能最好通过clang push/pops来抑制警告,如此线程中所示.
如果有人有一个有说服力的解释为什么作者使用... afterDelay方法,我将不胜感激.谢谢.
编辑2012年10月22日:我不相信@rmaddy给出的唯一答案完全适用于我的情况,但它仍然是一个很好的答案,所以我会接受它.我会密切关注这个问题,如果我发现任何新的东西,我会回来.谢谢.JZ
我有两个字符串:
NSString * className = "MyClass";
NSString * methodName = "doSomething";
Run Code Online (Sandbox Code Playgroud)
MyClass类定义和静态方法doSomething也存在.
如何从两个字符串动态触发[MyClass doSomething]?