【问题标题】:Using Reactive cocoa to observe UITouches?使用 Reactive cocoa 观察 UITouches?
【发布时间】:2013-10-19 06:54:14
【问题描述】:

我对反应性可可相当陌生,我试图在我尝试构建的游戏中加入 FRP 元素。从我的在线搜索来看,Reactive cocoa 的资源和文档似乎非常有限,并且大多数教程都使用相同的示例!

我想要做的是,拥有一个 RACSignal,它为视图上的当前触摸提供一个值流(为简单起见,假设没有多点触摸)。然后使用 subscribeNext 在 UITouch 对象发生变异时执行我的操作。我无法设置 RAC 信号本身!

目前我正在做以下事情(我不确定这是正确的方法!)

  @interface MyView:UIView{

      UITouch *currentTouch;
      RACSignal *touchSignal;
  }
  @property(nonatomic , assign)UITouch *currentTouch;



  @implementation MyView
  @synthesize currentTouch;

  -(id)init{
     if(self = [super init]){

    }
    return self;
  }

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

   NSArray *touchArray = [touches allObjects]; 
   for(UITouch *touch in toucheArray){   
       currentTouch = touch;  
       if(!touchSignal){
           touchSignal = [RACObserve(self , currentTouch) distinctUntilChanged];
       }

    }

}

但每次我 RACSignal 尝试初始化游戏时都会崩溃,我得到以下信息:

 [MyView rac_valuesForKeyPath:observer:]: unrecognized selector sent to instance 0x2084cf90

我做错了什么?设置 RACSignal 的正确方法是什么?另外,我如何在不同的对象(可能是 MyView 模型)中使用 touchSignal 并使用 subscribe next 在块中执行操作?

【问题讨论】:

    标签: ios reactive-cocoa


    【解决方案1】:

    我就是这样做的,使用-rac_signalForSelector:。这是更多的声明性,更少的命令(我认为你的错误来自于此)。

    RACSignal *touchSignal = [[[self
        rac_signalForSelector:@selector(touchesBegan:withEvent:)]
        reduceEach:^(NSSet *touches, UIEvent *event) {
            return [touches anyObject];
        }]
        distinctUntilChanged]
    

    【讨论】:

    • 谢谢会试一试。我假设我可以在另一个对象中订阅(使用 [[MyViewInstance touchSignal] subscribeNext:....])我的 touchSignal,只要它是 MyView 的公共属性?
    • 试过了。有同样的问题!由于未捕获的异常“NSInvalidArgumentException”,我得到了这个正在终止的应用程序,原因:“-[MyView rac_signalForSelector:]:无法识别的选择器发送到实例 0x20874d80”。我错过了什么?
    • 您确定 ReactiveCocoa 已正确链接到您的应用程序中吗?您将需要链接器标志-ObjC,在“其他链接器标志”中。完整步骤在这里:github.com/ReactiveCocoa/ReactiveCocoa#importing-reactivecocoa
    • 发生崩溃是因为 touchesBegan 方法不存在。如果您将 touchesBegan 的空实现添加到您的类,它将修复它。可能不是最好的解决方案。
    • @Dave Lee,如果我使用 -ObjC 标志,那么它可以工作,但我不想使用这个标志,因为它会影响我使用过的其他库。那么除了 -ObjC 之外还有其他方法吗?或者你能告诉我这个标志对运行 ReactiveCocoa 信号的依赖是什么吗?
    猜你喜欢
    • 2015-02-06
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多