菜鸟教程小白 发表于 2022-12-12 20:50:46

ios - UIButton performSelector :withObject:withObject: not making call


                                            <p><p>这是我的代码。</p>

<pre><code>    UIButton *button = ;
    button.frame = CGRectMake(110, 270, 100, 40);
    button.backgroundColor = ;
    ;
    ;
</code></pre>

<p>我想通过这个方法设置按钮标题颜色
但它不起作用!</p>

<pre><code>    [button performSelector:@selector(setTitleColor:forState:)
               withObject:
               withObject:@(UIControlStateNormal)];
</code></pre>

<p>有人知道为什么它不起作用吗???</p>

<hr/>

<p>感谢大家的帮助。
昨晚,我找到了一种使它起作用的方法。无论参数是 UIControlStateNormal(一种特殊情况)还是其他类似 UIControlStateHighlighted。
代码如下:</p>

<pre><code>   [button performSelector:@selector(setTitleColor:forState:)
                  withObject:
                  withObject:(__bridge id)((void *)UIControlStateNormal)];
   [button performSelector:@selector(setTitleColor:forState:)
                  withObject:
                  withObject:(__bridge id)((void *)UIControlStateHighlighted)];
   [button performSelector:@selector(setTitleColor:forState:)
                  withObject:
                  withObject:(__bridge id)((void *)UIControlStateSelected)];
</code></pre>

<p>所以问题解决了。</p>

<hr/>

<p>我发现它很有用!所以我想用它做更多的事情,
代码如下:</p>

<pre><code>    ;
    ;
    ;
    ];
</code></pre>

<p>当我测试时,我发现它再次不起作用!太失望了:(。如果有人对这个问题感兴趣,你可以测试一下。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果我正确理解您的意图,您是在要求让框架进行相应的调用,所以您期望 </p>

<pre><code>[button performSelector:@selector(setTitleColor:forState:)
               withObject:
               withObject:@(UIControlStateNormal)];
</code></pre>

<p>打电话</p>

<pre><code> forState:UIControlStateNormal];
</code></pre>

<p>您在这里遗漏了一件重要的事情:<code>performSelector:withObject:withObject:</code> 需要两个 <strong>objects</strong>。您将纯整数值(因为 <code>UIControlStateNormal</code> 是一些 int/enum 值)包装在 <code>NSNumber</code> 中。现在该对象(或指针,或地址,或任何你称之为的)作为第二个参数传递给 <code>setTitleColor:forState:</code> 这显然不是值本身,但因为该方法不知道这样,它将值解释为某种整数值。</p>

<p>所以稍后会调用这样的东西:</p>

<pre><code>NSNumber *number = ...; // your number object
forState:number];
</code></pre>

<p>正如另一个答案所说,它可能通过在此处省略 <code>@(...)</code> 运算符来工作,以便该值不包含在 <code>NSNumber</code> 中。这将发生:<code>NSControlStateNormal</code> 被定义为 <code>0</code>。因此编译器会将其解释为 <code>nil</code>,这是一个有效的对象,或者缺少一个对象。 <code>nil</code> 稍后将被重新解释为整数值作为 <code>UIControlState</code>,所以你的 <code>0</code> (== <code>UIControlStateNormal</code>) 再次。</p>

<p>这是一个有效的特殊情况,因为 <code>0</code> 可能被视为 <code>nil</code>。它不能与任何其他值一起工作(通常<strong>甚至不能编译</strong>),即 <code>UIControlStateFocused</code>。你会得到一个
“无法使用 '(anonymous enum ...)' 类型的右值初始化 'id' 类型的参数”错误。</p>

<p>如果你坚持走 performSelector: 路线,你可以添加这样的方法:</p>

<pre><code>-(void)setProperties:(NSDictionary *)props onButton:(UIButton *)button {
   UIColor *color = props[@&#34;color&#34;];
   NSNumber *stateWrapper = props[@&#34;state&#34;];
   UIControlState state = (UIControlState)stateWrapper.unsignedIntegerValue;
   ;
}
</code></pre>

<p>并像这样使用它:</p>

<pre><code>[self performSelector:@selector(setProperties:onButton:)
         withObject:@{@&#34;color&#34; : ,
                        @&#34;state&#34; : }
         withObject:button];
</code></pre>

<p>将值包装到 <code>NSValue</code> 中甚至可能更简洁,或者为参数使用专用类等。</p>

<p>但是,无论如何,我更喜欢 <code>dispatch_*</code> 数学,即</p>

<pre><code>dispatch_sync(dispatch_get_main_queue(), ^{
    forState:number];
})
</code></pre>

<p>或者使用 <code>dispatch_async</code> 或者你当时的意图。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIButton performSelector :withObject:withObject: not making call,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37962462/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37962462/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIButton performSelector :withObject:withObject: not making call