菜鸟教程小白 发表于 2022-12-13 00:14:22

objective-c - 告诉自定义委托(delegate)何时调用方法


                                            <p><p>我在 <a href="https://stackoverflow.com/questions/tagged/objective-c" class="post-tag" title="show questions tagged &#39;objective-c&#39;" rel="noreferrer noopener nofollow">objective-c</a> 中创建了一个包含各种方法的自定义类,并且我还向该类添加了委托(delegate)方法,可以从导入我的自定义类的另一个类调用这些委托(delegate)方法。特别是我正在使用iOS。这是我的头文件 (.h) 和实现 (.m) 文件的一个小示例:</p>

<pre><code>//iCloud.h
#import &lt;UIKit/UIKit.h&gt;
#import &lt;Foundation/Foundation.h&gt;

@protocol iCloudDelegate;
@class iCloud;

@interface iCloud : NSObject {
    __weak id&lt;iCloudDelegate&gt; delegate_;
}

@property (nonatomic, weak) id &lt;iCloudDelegate&gt; delegate;

//Methods (abridged for StackOverflow)
+ (void)checkCloudAvailability;

@end

@class iCloud;
@protocol iCloudDelegate &lt;NSObject&gt;
//Methods (abridged for StackOverflow)
@optional
- (void)documentWasSaved;
@required
- (void)iCloudAvailable:(BOOL)status;
@end
</code></pre>

<p>以及我的部分实现(.m):</p>

<pre><code>#import &#34;iCloud.h&#34;
@implementation iCloud
@synthesize delegate;

- (void)documentWasSaved {
    [ documentWasSaved];
}

-(void)iCloudAvailable:(BOOL)status {
    [ iCloudAvailable:status];
}

+ (void)checkCloudAvailability {
NSLog(@&#34;Checking iCloud availablity...&#34;);
NSURL *returnedURL = [ URLForUbiquityContainerIdentifier:nil];

if (returnedURL){
    NSLog(@&#34;iCloud is available&#34;);
} else {
    NSLog(@&#34;iCloud not available. ☹&#34;);
}
}
</code></pre>

<p>我查看了许多教程、SO 帖子、示例代码等,试图弄清楚<strong>如何告诉委托(delegate)何时调用委托(delegate)方法</strong>,但我一直无法找到任何东西。大多数帖子显示实现应该添加委托(delegate)(使用 <code><DelegateName></code> 语法),<em>然而</em>我的自定义类实现不是我想要使用委托(delegate)的地方(它在未在其中创建委托(delegate)的另一个类)。 </p>

<p>正如您在上面的示例代码中所见,我已经添加了委托(delegate)方法(在实现中),但据我所知,这一切都会在使用它的其他类中调用委托(delegate)方法。如果这是正确的,那么我如何让委托(delegate)调用这些方法(比如从我的 <code>checkCloudAvailability</code> 类,它不是委托(delegate)方法之一)?这是我正在尝试做的一个示例:</p>

<pre><code>+ (void)checkCloudAvailability
    if (returnedURL){
      [ iCloudAvailable:YES];
    ...
}
</code></pre>

<p>当我尝试使用 <code>[ methodName];</code> 行时,我收到以下错误,Xcode 假装它不再知道我在说什么:<img src="/image/IcQqn.png" alt="enter image description here"/> </p>

<p>为什么会这样?为什么我不能告诉委托(delegate)<em>何时</em>调用委托(delegate)方法?这在委托(delegate)方法中工作得很好,但为什么不能在实现它的类中呢?</p>

<p>我们将不胜感激任何想法、想法、链接、教程、代码或帮助。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>错误说它找不到方法 <code>delegate</code> 在 <em>class 方法</em> 的上下文中不可用(即用 <code>+</code> 表示的方法) > 标志)。这可能看起来令人困惑,因为类方法中的 <code>self</code> 不对应于实例,而是对应于类;另一方面,<code>delegate</code> 属性属于一个实例,这意味着它不可用。</p>

<p>要解决这个问题,您应该将 <code>checkCloudAvailability</code> 设为实例方法,或将其重写如下:</p>

<pre><code>+(void)checkCloudAvailabilityWithDelegate:(id&lt;iCloudDelegate&gt;)delegate {
    ...
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 告诉自定义委托(delegate)何时调用方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/14103578/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/14103578/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 告诉自定义委托(delegate)何时调用方法