【问题标题】:Trying to pass data between viewcontrollers - pass annotation title to new viewcontroller尝试在视图控制器之间传递数据 - 将注释标题传递给新的视图控制器
【发布时间】:2013-11-22 01:34:29
【问题描述】:

我查看了与在视图控制器之间传递数据相关的所有其他帖子,但没有一个可以解决我的问题。

我想将某人在 mapKit 中点击的注释的标题传递给新的视图控制器,以便我可以在新的视图控制器中使用该标题。我正在使用calloutAccessoryControlTapped 方法来检测何时有人点击了 detailDisclosure 按钮,然后使用以下代码将标题添加到第二个视图控制器(称为 detailViewController)中的属性:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:nil];
    detailViewController *viewController = (detailViewController *)[storyboard instantiateViewControllerWithIdentifier:@"detailViewController"];

    detailViewController *detailView = [[detailViewController alloc] init];

    // THIS IS WHERE I SET THE ANNOTATION TITLE TO THE PROPERTY IN THE SECOND VIEWCONTROLLER
    detailView.titleTime = view.annotation.title; 

    NSLog(@"view.annotation.title: %@", view.annotation.title); // SHOWS THE TITLE
    NSLog(@"detailView.titleTime: %@", detailView.titleTime);   // SHOWS THE TITLE


    // HERE I PRESENT NEW VIEWCONTROLLER (HOPING THE TITLE IS PASSED)
    [self presentViewController:viewController animated:YES completion:nil];

}

在第二个视图控制器(detailViewController)中,我在viewDidLoad 方法中有这个:

- (void)viewDidLoad
{
[super viewDidLoad];

// set the Title Label to the titleTime (passed from the mainViewController)
self.titleForDetail.text = self.titleTime;
NSLog(@"titleForDetail.text %@:", titleForDetail.text); // THIS IS NULL
 NSLog(@"titleForDetail.text %@:", titleTime); // THIS IS NULL
}

为什么是self.titleForDetail.textself.titleTime NULL?为什么原始 viewController 没有传递任何内容?

【问题讨论】:

  • 你在使用故事板吗?
  • 是的,我正在使用 StoryBoards。但我没有使用任何赛格威......我正在以编程方式推动我的观点。
  • 什么是titleTime?字符串属性?如果是这样,您如何同时引用 self.titleTime 和 titleTime?在最新版本的 Xcode 中,属性的支持实例变量以下划线为前缀,以便您知道何时使用该属性以及何时使用 iVar。另外,titleForDetail 是什么?标签,UITextField 还是 UITextView?您的代码看起来像 titleForDetail 是 nil
  • titleForDetail 是一个 UILabel,titleTime 是一个 NSString
  • calloutAccessoryControlTapped 中,您将属性设置为detailView,但随后呈现viewController

标签: ios uiviewcontroller


【解决方案1】:

calloutAccessoryControlTapped 中,代码在detailView 上设置titleTime 属性,但随后呈现viewController(没有设置属性)。

把现在改成:

[self presentViewController:detailView animated:YES completion:nil];


看起来您不需要 storyboardviewController 变量,因此您可以从该方法中删除它们。

【讨论】:

    【解决方案2】:

    您的代码中有这两行:

        detailViewController *viewController = (detailViewController *)[storyboard instantiateViewControllerWithIdentifier:@"detailViewController"];
        detailViewController *detailView = [[detailViewController alloc] init];
    

    在其余代码中,您有时使用 viewController,有时使用 detailView。您应该只拥有其中一个,并且应该像对 viewController 一样进行实例化:

    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
    {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:nil];
        detailViewController *detailView = (detailViewController *)[storyboard instantiateViewControllerWithIdentifier:@"detailViewController"];
        detailView.titleTime = view.annotation.title;
        [self presentViewController:detailView animated:YES completion:nil];
    }
    

    【讨论】:

    • 正确...但是 Anna 在上述 cmets 中排名第一。但是谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多