【问题标题】:How to set up a delegate to a class without the use of prepareForSegue如何在不使用 prepareForSegue 的情况下为类设置委托
【发布时间】:2014-03-12 07:02:27
【问题描述】:

我有两个班级,我希望他们互相交流。 A 类包含一个 tableView,当用户点击表格行时,我触发了我的 didSelectRowAtIndexPath 方法。在这种方法中,我需要通过委托通知 B 类。我知道委托是如何工作的,但很难弄清楚如何在不使用 prepareForSegue 方法的情况下设置 A 的委托。

通常我会在设置我的委托时这样做

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"goToManipulator"]) {
        ManipulatorViewController *secondVC = (ManipulatorViewController *) segue.destinationViewController;
        [secondVC setDelegate:self];
    }
}

但是如何在不使用 prepareForSegue 的情况下设置委托?

提前致谢

编辑:

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

http://oi62.tinypic.com/2li99w1.jpg

【问题讨论】:

  • 你的意思是你没有使用segue来创建新的控制器?那你是怎么创作的呢?
  • 您只想使用编码吗?
  • 你想如何创建secondVC?来自 xib、情节提要还是以编程方式?
  • 我应该更好地解释它,但请查看我所做的编辑。是的,我相信我需要使用某种 segue 来创建新的视图控制器。 :)
  • @All : 如果我的目标 VC 不是 UIViewController 类怎么办。就像在我的情况下,它的 UIPageViewConroller 和我不能使用为 Segue 做准备作为它寻找 UIViewController 的目的地

标签: ios iphone delegation


【解决方案1】:
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ManipulatorViewController *secondVC = [[ManipulatorViewController alloc] init...];
    [secondVC setDelegate:self];

    //if you use push transition in UINavigationController
    [self.navigationController pushViewController:secondVC animated:YES];

    //if you use modal transition
    [self presentViewController:secondVC animated:YES completion:nil]
}

init... 表示初始化取决于你的程序架构。

编辑

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

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

并且不要忘记在情节提要中为您的 viewController 添加标识符。

【讨论】:

  • 如果你不想使用 prepare for segue 方法(我不知道你为什么不这样做)你需要像 Valentin 上面那样将 VC 推入堆栈。但是请注意,您也可以通过情节提要初始化ManipulatorViewController,而不是allocinit。这是获得对新视图控制器的引用的唯一其他方式。
【解决方案2】:

我理解你的用例是这样的:

在 Receiver 中,您打开 Sender。您可以在此处选择一个值,然后在选择该值后将新值告知接收方。

您可以在 Sender 上创建一个由 Receiver 实现的协议。然后,在 Sender 中捕获所选值的函数中,调用协议方法(例如 didSelectNewName() 或其他东西)。

当然,您需要一个 Receiver 的句柄,这通常是通过委托获得的。但是无论你使用 segue 还是其他方法从 Receiver 过渡到 Sender,你都将有机会设置 Sender 的委托。

如果这不是您要查找的内容,请准确说明您如何初始化 Sender,以及为什么不希望使用 segue。

【讨论】:

  • 到目前为止,我在“发送者”上有一个协议,并且我已经让我的“接收者”实现了这个协议以及一个所需的方法。我只是找不到设置发件人代表“id delegate;”的方法使用我使用的故事板结构。我仍然愿意使用 segue,但是,你可以告诉我如何解决这个难题? :)
  • 我在您的故事板上看到您已将它们链接在一起作为故事板嵌入 Segue。这意味着您可以(应该)使用 segue 转换到 Sender。所以我不确定我是否理解你的问题......?
【解决方案3】:

当点击 A 的单元格时,视图控制器 B 是否已经实例化?如果是,并且您没有使用 prepareForSegue 来获取其他 View Controller 的身份,那么使用 NSNotification Center 可能会更好。在 View Controller A 的 didSelectRowAtIndex 方法中,可以放

[[NSNotificationCenter defaultCenter] postNotificationName:@"yourNotificationName" object:nil userInfo:dictionaryWithYourData];

它会向您的整个应用发出通知,告知您选择了该行。如果你事先用你想要的任何信息初始化字典,它可以通过 userInfo 传递。然后,在 View Controller B 的 viewDidLoad 中,添加

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethod:) name:@"yourNotificationName" object:nil];

让它监听通知。您设置的选择器将接受 NSNotification 作为参数,因此您可以按如下方式获取字典:

- (void)yourMethod:(NSNotification *)notification
{
    NSDictionary *yourData = [notification userInfo];
}

【讨论】:

    【解决方案4】:

    这就是我的工作。

    .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];
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      相关资源
      最近更新 更多