【问题标题】:Pushing a segue from xib file not in storyboard?从不在情节提要中的xib文件中推送segue?
【发布时间】:2014-08-04 03:11:38
【问题描述】:

我正在尝试完成一些事情,我正在寻找一些技巧。我开始研究一个由一个 xib 文件组成的项目。后来我升级到 xcode 5,很快我的其余接口文件就开始使用我的故事板,但是我保留了我的旧 xib(主要是因为我如何将方法传递给它)并简单地称之为:

mapViewController *mapView=[[mapViewController alloc]initWithNibName:@"mapViewController" bundle:nil location:0 option:@"poe"];

最近我添加了新功能,单击标注后,我想为要显示的新视图准备一个转场。 首先在xib界面。我想知道我是否可以从我的 mapView(不在故事板中)准备并调用视图/segue(在故事板中)。 或者,如果我可以简单地将我的 mapView 拖放或复制并粘贴到我的故事板中,然后将我的 segue 连接器绘制到我的新视图中。因为我认为我不一定要将 mapView 添加到我的“故事情节”中,但是我仍然想调用上面发布的方法。 但是,如果这些都不可行,请提出另一种方法。 谢谢 更新 我已将我的 xib 移动到我的故事板界面,但是我遇到了一个小问题

当我从 xib 调用我的地图时,它会放大到 init 方法中提供的特定位置。我传递了相同的参数,但在我的情节提要中重新创建旧结果时遇到了一些问题

    if ( ([receivedRainObject isEqualToString:@"Natural"])) {

 //    mapViewController *mapView=[[mapViewController       //alloc]initWithNibName:@"mapViewController" bundle:nil location:0 option:@"na"];

 //   self.navigationItem setHidesBackButton:NO animated:NO];
 //      [self.navigationController setNavigationBarHidden:NO animated:YES];
  //      [self.navigationController pushViewController:mapView animated:NO];
             [self performSegueWithIdentifier:@"countryMap" sender:self];   
    }

然后在准备srgue

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"countryMap"]) {
         mapViewController *transferViewController=segue.destinationViewController;
        transferViewController.location=0;
        transferViewController.option=@"na";

    }
}

然后在视图中加载了地图 位置确实评估为 0,断点显示所有这些代码都在逐步执行,但我提供的坐标区域不是显示的内容。(跨度或区域) (但是当我调用我的旧 xib 时它工作正常)

- (void)viewDidLoad
{
    [super viewDidLoad];
   {

    // Do any additional setup after loading the view from its nib.

    if (location==0)
    {

         CLLocationCoordinate2D location1;
         location1.latitude=(double)15.435786;
         location1.longitude=(double)-61.318447;


                    MKCoordinateRegion region;
                    MKCoordinateSpan span;
                    span.latitudeDelta=0.50;
                    span.longitudeDelta=0.40;
                    region.span=span;
                    region.center= location1;

                    [mapView setRegion:region animated:TRUE];
                    [mapView regionThatFits:region];
               }
}

我的地图视图的初始化

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil location:(int)num option:(NSString *)row
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.location=num;
        self.option=row;

    }
    return self;
}

【问题讨论】:

    标签: ios uistoryboard


    【解决方案1】:

    在你的 mapView 中,你应该可以在 callout 方法中做这样的事情:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YourStoryBoardName" bundle:[NSBundle mainBundle]];
    YourViewControllerFromStoryBoard *viewController = [sb instantiateViewControllerWithIdentifier:@"YourViewControllerIdentifierInYourStoryBoard"];
    

    然后在你的 mapView 中你可以重写 prepareForSegue 来做任何准备工作,然后展示你的 viewController。

    【讨论】:

      【解决方案2】:

      您不能在 xib 定义的控制器和故事板定义的控制器之间调用 segue(或者在两个不同故事板中的控制器之间)。您可以使用 UIStoryboard 方法 instantiateViewControllerWithIdentifier: 实例化情节提要中的控制器,然后将其推送或呈现在代码中。从您的问题中不清楚为什么您不想将基于 xib 的控制器移动到您的“故事情节”中。你可以在那里创建一个新的控制器,如果你想走这条路,从你的 xib 文件中复制并粘贴视图。

      【讨论】:

      • 我正要移动它等等,但遇到了一些小问题。编辑主要问题
      • @user3737880,什么是transferViewController?那是您要使用的控制器吗?此外,如果您有需要在 init 方法中运行的代码,则需要为在情节提要中制作的控制器而不是 initWithNibName:bundle: 实现 initWithCoder:。
      • 是的,就是 transfewViewController。我用它来保存或“准备”我想要传递的变量。如果没有正确完成,请告知。我还展示了我的 initWithNibName,但我不明白为什么我需要说 initWithCoder。不应该 [self performSegueWithIdentifier:@"countryMap" sender:self];已经调用了我通过旧的 initWithNibName 传入的变量?显然它正在这样做,但为什么代码执行而不是地图没有显示我想要的位置
      • @user3737880,你不需要使用 initWithCoder:如果你只需要在 prepareForSegue 中传递数据。我只是想确保您没有在未运行的 init 方法中进行其他设置。我不知道您为什么没有显示所需的区域。你是怎么做到的?您的问题中还有 viewDidLoad 中的代码吗?我没有看到您使用传入的位置和选项值(如果这仍然是您要传递的)。您应该使用您现在使用的代码更新您的问题。
      • 显示的位置是viewdidload中的代码。当我从 xib 而不是情节提要加载我的地​​图时,它可以工作。我不明白为什么,因为代码在从情节提要中调用时会运行。(我应该为此提出一个新问题吗?)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多