相关疑难解决方法(0)

走响应链以传递自定义事件.这是错的吗?

根据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一样)?

编辑:

我想要完成什么?

我有一个视图控制器,它有一个视图,有子视图等...几个子视图是一个特定类型,显示数据库中的项目.当用户点击此视图时,应将信号发送到控制器以导航到此项目的详细信息页面.

处理点击的视图位于视图层次结构中主视图下方的几个级别.我必须告诉控制器(或在某些情况下,特定的子视图"向上链")选择了一个项目.

听通知是一种选择,但我不喜欢这种解决方案,因为选择一个项目不是全局事件.它严格依赖于当前的视图控制器.

iphone events cocoa ios

18
推荐指数
3
解决办法
7799
查看次数

如何以编程方式触发uibarbuttonitem click事件

我创造了一个 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委托方法中触发按钮事件(不触摸按钮)

iphone events uibarbuttonitem uiactionsheet ios

18
推荐指数
3
解决办法
2万
查看次数

NSStatusBarButton保持突出显示

从OS X 10.10开始,大部分NSStatusItem都被弃用,而不是该button属性,该属性由NSStatusBarButton组成.它应该像普通按钮一样工作,但遗憾的是NSStatusButton中的cellsetCell方法也已被弃用.由于这个原因,我很难找到一种方法来保持按钮在点击后突出显示(通常按钮在鼠标按下时突出显示,在鼠标向上突出显示.我希望在鼠标按下后保持按钮突出显示).

调用[NSStatusButton setHighlighted:]它的动作不起作用,因为一旦鼠标启动它似乎不会自动亮起.另一方面,使用延迟在下一个循环中调用它,即使[self performSelector: withDelay:]突出显示以相当难看的方式闪烁.它有效,但看起来不太好.

设置按钮类型以NSToggleButton完全删除突出显示,而是突出显示奇怪的模板图像.

这是我能想到的唯一方法.反正有没有覆盖这个NSButtonCell mouseUp行为?

macos cocoa objective-c nsstatusitem osx-yosemite

12
推荐指数
3
解决办法
2612
查看次数

PerformSelector警告

我收到了警告

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)

objective-c compiler-warnings ios performselector

10
推荐指数
2
解决办法
1万
查看次数

performSelector:withObject:及其保留行为

这是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

9
推荐指数
2
解决办法
4859
查看次数

Swift 2 - iOS - 发送回原始线程

所以我有一个应用程序,它触发一系列异步事件,然后将结果写入缓冲区.问题是我希望缓冲区同步写入(在产生异步进程的线程中)

骨架代码就是这样

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)

multithreading nsthread ios swift swift2

9
推荐指数
1
解决办法
746
查看次数

Xcode ARC(自动引用计数),"发布不可用"

我第一次使用Xcode时,我在线学习了一个教程.我按照教程向我展示了所有内容,但我担心它已经过时了.

我遇到的错误是:

[font_attributes release]; 
Run Code Online (Sandbox Code Playgroud)

'release'不可用:在自动参考计数模式下不可用

ARC禁止"发布"的显式消息发送

我对Cocoa和Xcode的了解有限,但我仍然希望扩展我的学习.

我该如何解决这个ARC问题?

xcode cocoa automatic-ref-counting

8
推荐指数
2
解决办法
3万
查看次数

performSelector ARC警告

可能重复:
performSelector可能导致泄漏,因为其选择器未知

我在非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)

xcode objective-c ios automatic-ref-counting

8
推荐指数
1
解决办法
9219
查看次数

"performSelector:withObject:afterDelay:"之间的区别是什么,其中delay是0,只是调用选择器?

我正在开发一个使用第三方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

messaging objective-c selector

7
推荐指数
1
解决办法
1761
查看次数

从string动态调用类的静态方法

我有两个字符串:

NSString * className = "MyClass";
NSString * methodName = "doSomething";
Run Code Online (Sandbox Code Playgroud)

MyClass类定义和静态方法doSomething也存在.

如何从两个字符串动态触发[MyClass doSomething]?

objective-c

6
推荐指数
1
解决办法
6317
查看次数