【问题标题】:Unable to send data from MainViewController to ContainerView with delegate无法使用委托将数据从 MainViewController 发送到 ContainerView
【发布时间】:2015-03-06 07:50:48
【问题描述】:

我创建了简单的 ipad 应用程序,我想将值从 MainViewController 发送到 ContainerViewController。我对这个应用程序的整个目标是将值从 Container(A) 发送到 MainViewController,然后将 MainViewController 发送到 Container(B)。我能够将值从 Container(A) 发送到 MainViewController,但我无法将数据从 MainViewController 发送到 Container(B)。我认为我对 prepareForSegue 的使用是错误的。 ?我添加了图片来描述我的情况。

提前致谢。

A_ContainerViewController.h

@class A_ContainerVC;
@protocol A_ContainerVCDelegate <NSObject>
-(void)sendValue:(NSString *)Name;
@end

@interface A_ContainerViewController : UIViewController

@property(nonatomic,assign) id <A_ContainerVCDelegate> delegate

- (IBAction)btnSend:(id)sender;

@end

A_ContainerViewController.m

- (IBAction)btnSend:(id)sender {

    NSString *text=@"Tutorial";

    [self.delegate sendValue:text];

}

ViewController.h

#import <UIKit/UIKit.h>
#import "A_ContainerViewController.h"

@class MainVC;
@protocol MainVCDelegate <NSObject>  

-(void)sendValue2:(NSString *)Name;

@end

@interface ViewController : UIViewController

@property(nonatomic,assign) id <MainVCDelegate> delegate;

@property (strong, nonatomic) IBOutlet UILabel *lblVC;

@end

ViewController.m

@interface ViewController () <A_ContainerVCDelegate>

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"A"]) {


        [(A_ContainerViewController *)segue.destinationViewController setDelegate:self];

    } 
}


-(void)sendValue:(NSString *)Name{

    lblVC.text = Name;
    [self.delegate sendValue2:Name];

}

B_ContainerViewController.h

    #import <UIKit/UIKit.h>
    #import "ViewController.h"
    #import "A_ContainerViewController.h"
    @interface B_ContainerViewController : UIViewController

@property (strong, nonatomic) IBOutlet UILabel *lbl_B_VC;
@end

B_ContainerViewController.m

    @interface B_ContainerViewController ()<MainVCDelegate>
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"B"]) {


            [(ViewController *)segue.destinationViewController setDelegate:self];

            /*
             LayersViewController *layersViewController = (LayersViewController*)segue.destinationViewController;
             layersViewController.name=@"Deneme";
             */


        }

    }

-(void)sendValue2:(NSString *)Name{

    lbl_B_VC.text=Name;

}

【问题讨论】:

  • 你检查delegate是否不为零吗?我假设您在单击控制器 A 上的按钮时调用委托方法,同时控制器 B 的委托设置在尚未执行的 -prepareForSegue 方法上。
  • 首先我认为你应该改变你的语法。
  • @kayzersoze 我为什么要改变我的语法。我不明白
  • @fozoglu 这只是一个建议,如果你的语法清晰,你的代码更容易修复。

标签: ios objective-c segue uicontainerview


【解决方案1】:

从情节提要中,Control 将 A 和 B 控制器的 IBOutlets 拖入主控制器。然后,在 MainViewController 的 viewDidLoad 方法中,将容器 A 和 B 的代理都设置为 self。

【讨论】:

    【解决方案2】:

    在 B_ContainerViewController.m 中:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"B"]) {
    
    
            [(ViewController *)segue.destinationViewController setDelegate:self];
    
            /*
             LayersViewController *layersViewController = (LayersViewController*)segue.destinationViewController;
             layersViewController.name=@"Deneme";
             */
    
    
        }
    
    }
    

    为什么这段代码在 B_ContainerViewController.m 中?因为如果我正确理解了您的场景,您在 ViewController 类中添加了 A 和 B Container VC。所以你应该在ViewController.m的prepareForSegue中添加B作为委托

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"A"]) 
        {
            [(A_ContainerViewController *)segue.destinationViewController setDelegate:self];    
        }
        else if([segue.identifier isEqualToString:@"B"])
        {
            self.delegate = (B_ContainerViewController *)segue.destinationViewController;//B should conform to MainVCDelegate
        } 
    }
    

    【讨论】:

    • 我试试代码。 Xcode 在 ViewController.m 处给我这个错误 -> Assigning to assignmenting to id from in compatible type 'B_ContainerViewControlle'
    • 使 B_ContainerViewController 符合 MainVCDelegate @interface B_ContainerViewController : UIViewController
    • 是的,我做了但没有改变警告。这个完整代码link
    • 检查了代码,您已将 添加到 .m 文件中的匿名扩展名中。你需要在你的 .h 文件中。这样其他类就会知道您的 B_ContainerViewController 符合某个协议。
    • 对不起,我也很困惑。你能从头一步一步解释吗?
    【解决方案3】:

    这里有一些我看不到的东西...... 这是对委托模式的错误使用!如果你想将一个值传递给另一个UIViewController,你必须在另一个中保存对它的引用。然后您可以在.h 文件中指定一个公共方法并从其他控制器调用它。

    例如,在B_ContainerViewController中:

    // .h file
    @interface B_ContainerViewController : UIViewController
    
    @property (strong, nonatomic) NSString *labelTextValue;
    @end
    // .m file
    @interface B_ContainerViewController ()
    {
        IBOutlet UILabel *lbl_B_VC;
    }
    @end
    @implementation
    @synthesize labelTextValue = _labelTextValue;
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"B"]) 
        {
    
            /*
             LayersViewController *layersViewController = (LayersViewController*)segue.destinationViewController;
             layersViewController.name=@"Deneme";
             */
        }
    
    }
    
    -(void)setLabelTextValue:(NSString *)labelTextValue
    {
         _labelTextValue = labelTextValue;
        [lbl_B_VC setText: _labelTextValue];
    }
    

    因此,在控制器 A 中,在 IBAction 上,您必须这样做:

    referenceToControllerB.labelTextValue = @"TEXT";
    

    【讨论】:

    • 我试试你说的,我已经修改了我的代码。由于找不到对象错误,我应该写什么referenceToControllerB。
    • 如果你不想创建循环引用,你必须定义一个“超级”对象(我认为是ViewController)。现在想想你的代码/segue 流。如果您的 AContainerController 委托 ViewController 可能会更好。然后,在 ViewController 中存储对 B_ContainerController 的引用并设置其属性。
    • 我不知道如何用代码做你最后的推荐
    • 这是我的完整代码link
    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多