菜鸟教程小白 发表于 2022-12-13 15:09:02

ios - 使用委托(delegate)在 View Controller 之间进行通信


                                            <p><p>在问了一些问题后,我学会了如何从一个 ViewController 向另一个 ViewController 发送命令,并设法编写代码使其正常工作,但没有任何反应......</p>

<p>在我的项目中,我有两个名为 <code>sayfa1</code> 和 <code>sayfa23</code> 的 ViewController 。当点击 <code>sayfa1</code> 上的按钮时,它将打开 <code>sayfa23</code> 并在标签上写字(你好,请参见下面的代码),但它没有发生。在模拟器上,该按钮仅打开 <code>sayfa23</code> 并且标签没有任何反应。如果你看代码你会更好地理解它。</p>

<p>sayfa1.h</p>

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

@protocol sayfa1Delegate &lt;NSObject&gt;

- (void)dealWithButton1;

@end


@interface sayfa1 : UIViewController

@property(nonatomic,assign) id&lt;sayfa1Delegate&gt; delegate;

@end
</code></pre>

<p>sayfa1.m</p>

<pre><code>#import &#34;sayfa1.h&#34;

@interface sayfa1 ()

@end

@implementation sayfa1

@synthesize delegate;

-(IBAction)button
{
    ;
}

@end
</code></pre>

<p>sayfa23.h</p>

<pre><code>#import &lt;UIKit/UIKit.h&gt;
#import &#34;sayfa1.h&#34;

@interface sayfa23 : UIViewController &lt;sayfa1Delegate&gt;
{
    IBOutlet UILabel *label;
    sayfa1 *vc1 ;
}

@end
</code></pre>

<p>sayfa23.m</p>

<pre><code>#import &#34;sayfa23.h&#34;
#import &#34;sayfa1.h&#34;

@interface sayfa23 ()

@end

@implementation sayfa23

- (void)dealWithButton1
{
    vc1.delegate = self;   
    int random_num;
    random_num = (arc4random() % 5 - 1) + 1;
    if (random_num == 1)
    {
      label.text = @&#34;hello1&#34;;   
    }
    else if (random_num == 2)
      label.text = @&#34;hello2&#34;;
    else if (random_num == 3)
      label.text = @&#34;hello3&#34;;
    else if (random_num == 4)
      label.text = @&#34;hello4&#34;;
}

@end
</code></pre>

<p>编写此代码后,我将按钮连接到 <code>sayfa23</code>,因此它会打开新页面,我也将该按钮连接到 <code>sayfa1</code> 以接收按钮操作并连接标签(在 <code>sayfa23</code>) 到 <code>sayfa23</code> 接收标签订单。但正如我所说的,没有发生任何错误,也没有你好,我做错了什么?我在我的一些 h 文件的顶部导入了 <code>sayfa1.h</code> 或 <code>sayfa23.h</code> 导致 Xcode 给我一个关于未定义并解决该问题的错误,但这是我的错误吗或者别的什么。</p>

<p>我想要的例子。</p>

<ul>
<li><p>用户打开应用</p></li>
<li><p><code>sayfa1</code> 显示在屏幕上</p></li>
<li><p>用户点击按钮,<code>sayfa23</code> 显示 <code>sayfa23</code> 上的标签文本由 <code>sayfa1</code> 处的按钮更改随便写 hello1..2..3 等...</p></li>
</ul>

<p>我做错了什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>重读你的问题,你问你的第一个 ViewController 如何打开第二个 ViewController 并设置一个文本框。如果那确实是您要尝试做的事情,那将是一个简单得多的问题,根本不需要委托(delegate)协议(protocol)或委托(delegate)。 </p>

<p>之前的两个答案是通过代表的讨论得出的,但这是为了解决不同的问题。仅当您需要第二个 Controller 将某些内容传递回第一个 Controller 时,才需要委托(delegate)。但是如果你只是想让你的第二个 Controller 从第一个 Controller 接收一些东西,它很简单:</p>

<pre><code>//FirstViewController.h

#import &lt;UIKit/UIKit.h&gt;

@interface FirstViewController : UIViewController

@end
</code></pre>

<p>实现如下:</p>

<pre><code>//FirstViewController.m

#import &#34;FirstViewController.h&#34;
#import &#34;SecondViewController.h&#34;

@implementation FirstViewController

- (NSString *)generateRandomText
{
    NSString *result;

    int random_num;
    random_num = (arc4random() % 5 - 1) + 1;
    if (random_num == 1)
      result = @&#34;hello1&#34;;   
    else if (random_num == 2)
      result = @&#34;hello2&#34;;
    else if (random_num == 3)
      result = @&#34;hello3&#34;;
    else if (random_num == 4)
      result = @&#34;hello4&#34;;

    return result;
}

// if you&#39;re using NIBs, it might be something like...
// you only need this method if you&#39;re using NIBs and you&#39;ve manually hooked a button up to this
// if you&#39;re using segues, get rid of `goToNextViewController` and just use the following `prepareForSegue

- (IBAction)goToNextViewController:(id)sender
{
    SecondViewController *secondController = [ initWithNibName:@&#34;SecondView&#34; bundle:nil];
    secondController.textFromParent = ;
    ;
}

// if you&#39;re using segues, give your segue an identifier, e.g. toSecondViewSegue, in Interface Builder and reference the exact same identifier here
// if you&#39;re not using segues, you don&#39;t need this prepareForSegue method

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ()
    {
      SecondViewController *destinationController = segue.destinationViewController;

      destinationController.textFromParent = ;
    }
}

@end
</code></pre>

<p>您的第二个 Controller 可能如下所示:</p>

<pre><code>//SecondViewController.h

#import &lt;UIKit/UIKit.h&gt;

@interface SecondViewController : UIViewController

@property (strong, nonatomic) NSString *textFromParent;
@property (weak, nonatomic) IBOutlet UILabel *label;

@end
</code></pre>

<p>使用如下实现:</p>

<pre><code>//SecondViewController.m

#import &#34;SecondViewController.h&#34;

@implementation SecondViewController

@synthesize textFromParent = _textFromParent;
@synthesize label = _label;

- (void)viewDidLoad
{
    ;

    self.label.text = self.textFromParent;
}

@end
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用委托(delegate)在 ViewController 之间进行通信,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11632043/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11632043/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用委托(delegate)在 View Controller 之间进行通信