Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在不使用prepareForSegue的情况下设置类的委托_Ios_Iphone_Delegation - Fatal编程技术网

Ios 如何在不使用prepareForSegue的情况下设置类的委托

Ios 如何在不使用prepareForSegue的情况下设置类的委托,ios,iphone,delegation,Ios,Iphone,Delegation,我有两门课,我想让他们互相交谈。类A包含一个tableView,当用户点击一个表行时,我触发didSelectRowatineXpath方法。在这个方法中,我需要通过一个委托通知类B。我知道委托是如何工作的,但很难理解如何在不使用prepareForSegue方法的情况下设置委托 通常我会在设置我的代表时这样做 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identif

我有两门课,我想让他们互相交谈。类A包含一个tableView,当用户点击一个表行时,我触发didSelectRowatineXpath方法。在这个方法中,我需要通过一个委托通知类B。我知道委托是如何工作的,但很难理解如何在不使用prepareForSegue方法的情况下设置委托

通常我会在设置我的代表时这样做

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"goToManipulator"]) {
        ManipulatorViewController *secondVC = (ManipulatorViewController *) segue.destinationViewController;
        [secondVC setDelegate:self];
    }
}
但是,如果不使用prepareForSegue,如何设置委托

提前谢谢

编辑:

这就是我的故事板的结构。“接收者”视图控制器将获取数据并显示在“当前名称”标签中,具体取决于从最右侧的“发送者”视图控制器在tableview中选择的内容

init…
意味着初始化取决于您的程序架构

编辑

如果要从情节提要中获取
secondVC
,请使用

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    ManipulatorViewController* secondVC = [storyboard instantiateViewControllerWithIdentifier:@"secondVC"];

别忘了在故事板中为viewController添加标识符。

我理解您的用例如下:

- (IBAction)goToView2:(id)sender {
    if (!svc) {
        svc = [[self storyboard] instantiateViewControllerWithIdentifier:@"View2"];
        [svc setDelegate:self];
    }
    [[self navigationController] pushViewController:svc animated:YES];
}
在接收器中,打开发送器。在这里,您选择一个值,选择该值后,您希望将新值告知接收者

您可以在发送方上创建接收方实现的协议。然后,在捕捉发送方中所选值的函数中,调用协议方法(例如didSelectNewName()或其他方法)

当然,您需要接收者的句柄,这通常是通过委托获得的。但是,无论您使用segue或其他方法从接收方转换到发送方,您都将有机会设置发送方的委托


如果这不是您想要的,请准确解释如何初始化发送方,以及为什么不需要segue。

点击A的单元格时视图控制器B是否已经实例化?如果是,并且您没有使用prepareForSegue获取另一个视图控制器的标识,则最好使用NSNotification Center。在视图控制器A的didSelectRowAtIndex方法中,可以

[[NSNotificationCenter defaultCenter] postNotificationName:@"yourNotificationName" object:nil userInfo:dictionaryWithYourData];
它将向您的整个应用程序发出一个通知,表明该行已被选中。如果您使用任何您想要的信息初始化字典,它可以通过userInfo传递。然后,在视图控制器B的viewDidLoad中,添加

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethod:) name:@"yourNotificationName" object:nil];
让它监听通知。您设置的选择器将接受NSNotification作为参数,因此您可以按如下方式获取字典:

- (void)yourMethod:(NSNotification *)notification
{
    NSDictionary *yourData = [notification userInfo];
}
我就是这么做的

在.m文件中:

@implementation ViewController{

   SecondViewController *svc;

}
然后在下面,您需要执行以下操作:

- (IBAction)goToView2:(id)sender {
    if (!svc) {
        svc = [[self storyboard] instantiateViewControllerWithIdentifier:@"View2"];
        [svc setDelegate:self];
    }
    [[self navigationController] pushViewController:svc animated:YES];
}

只需确保在脚本中为声明协议的ViewController设置正确的标识符。

您的意思是您没有使用segue来创建新的控制器?那么您是如何创建它的?您想只使用编码吗?您想如何创建
secondVC
?从xib、从故事板还是从编程角度?我应该更好地解释它,但请看我所做的编辑。是的,我相信我需要使用某种序列来创建新的视图控制器。:)@全部:如果我的目标VC不是UIViewController类怎么办。就像我的例子中的UIPageViewConroller一样,我不能使用prepare for Segue作为UIViewControllers寻找目的地,因为我在“发送方”上有一个协议,我让我的“接收方”与一个必需的方法一起实现这个协议。我就是找不到一种方法来设置发送者的委托“id delegate;”和我使用的故事板结构。我仍然愿意使用segue,但是,你可以告诉我如何解决这个难题吗?:)我在你的故事板上看到,你已经将它们链接在一起作为一个故事板嵌入段。这意味着您可以(应该)使用segue转换到发送方。所以我不确定我是否理解你的问题…?如果你不想使用prepare for segue方法(我不知道为什么你不想),你需要像Valentin那样将VC推到堆栈上。但是,请注意,您也可以通过故事板而不是
alloc
init
来初始化
ManipulatorViewController
。这是获得对新视图控制器的引用的唯一其他方法。