【问题标题】:How do I pass an object into a delegate?如何将对象传递给委托?
【发布时间】:2010-08-12 00:50:29
【问题描述】:

我正在创建一个委托视图控制器并将其呈现给用户以执行操作,但我想根据原始视图控制器更改委托视图控制器上的 NSString。例如,如果委托视图控制器是 viewControllerA 的委托,则显示 Foo,但如果它是 viewControllerB 的委托,则显示 Blah。虽然我不知道如何传递某种指示原始视图控制器是什么的信息。我注意到如果我执行 NSLog(@"I'm from %@",[self delegate]);它会告诉我原始视图控制器是什么以及内存地址,但我似乎无法将其转换为 NSString 对象来检查其值。如果有办法让它发挥作用,或者有更好的方法来做到这一点,那么它也可以......

- (IBAction)editDate {
DatePickerViewController *datePickerView = [[DatePickerViewController alloc] init];
datePickerView.delegate = self;
datePickerView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:datePickerView animated:YES];
[datePickerView release];
}

【问题讨论】:

    标签: iphone objective-c cocoa


    【解决方案1】:

    您使用的某些术语似乎与大多数 Objective-C 编码人员的意思不同。

    在这里,您将实例化一个视图控制器以显示为模态视图。该视图控制器有一个名为 delegate 的属性,允许它调用一些方法来报告其状态的更改。这不会使它成为“委托视图控制器”,而是使其成为“具有委托的对象”。

    您碰巧使用另一个视图控制器类作为委托,但任何实现 DatePickerViewController 对象想要调用以报告更改的方法的对象都可以分配给该委托属性。


    我认为您要问的问题是“如何使 DatePickerViewController 根据报告的对象类型显示不同的信息?”,答案与“如何制作 UILabel根据创建它的视图控制器显示不同的文本?”——您在创建它时设置属性或调用方法。

    如果你真的只是想将一个字符串传递给 DatePickerViewController,你可以添加一个 NSString* 属性到 DatePickerViewController 并使用任意文本设置它,使用

    datePickerView.myString = @"some information that you want";
    

    【讨论】:

      【解决方案2】:

      您可以使用委托的类。

      if([[self delegate] isKindOfClass:[ViewControllerA class]]) {
          [self doViewControllerAThings];
      }
      else {
          ...
      }
      

      【讨论】:

      • 必须知道你的委托是什么类型的对象,尤其是在此基础上改变你的行为,这表明你在做一些架构错误的事情。您应该用一个描述性命名的委托方法替换它,每个委托都按照它认为合适的方式实现。这称为多态性,以这种方式将其集成到您的委托协议中可以使委托类更加健壮。
      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多