【问题标题】:passing a string value from one view controller to a second variable view controller Xcode将字符串值从一个视图控制器传递到第二个变量视图控制器 Xcode
【发布时间】:2014-02-14 21:47:16
【问题描述】:

我有一个应用程序,我根据用户在应用程序中的位置加载可变视图控制器。这是我的代码。

-(IBAction)buttonPressed:(id)sender;{
    if (mission <1) {
    gameViewController *detailViewController = [[gameViewController alloc] initWithNibName:@"gameViewController" bundle:nil];
        [self.navigationController pushViewController:detailViewController animated:YES];
        detailViewController.which2 = which;
    }
    else if (mission > 0) {
    NSString *viewController = @"gameViewController";

    NSString *missionViewController = [viewController stringByAppendingString:missionNo];

    Class controllerClass = NSClassFromString (missionViewController);
    id detailViewController = [[controllerClass alloc] initWithNibName:@"gameViewController" bundle:nil];
    NSLog(@"missionViewController;%@",missionViewController);

        [self.navigationController pushViewController:detailViewController animated:YES];


     detailViewController .which2 = which;


    }

}

一切都很好,除了我想将一个字符串从第一个视图控制器传递到第二个视图控制器,这可能是一个。

如你所见,我在 detailViewController.which2 = which; 上方添加了代码

我在我的第一个视图控制器中创建了属性并合成了 NSString *which,在所有后续视图控制器中合成了 NSString *which2。在第一个任务是

其他 viewController 是 gameViewController1、gameViewController2 等。每个都相当长且复杂。但它们都加载到同一个 xib 文件 gameViewController 中。用户完成该游戏视图后,会有一个 UIlabel 更新为更高,因此他们可以继续进行系列中的下一个或返回主菜单。如果他们返回主菜单,数字将被添加到“gameViewController”,以便加载正确的。所以我不能指定要加载哪个视图控制器,因为它取决于用户的位置。因此,添加了任务# 的missionViewController 以加载正确的视图控制器。随后的每个视图控制器都有一个 which2 创建和合成。如果我们假设所有后续视图控制器都只有一个 UILabel,它将在其中显示字符串“which2”。我要做的就是将字符串“which”传递给下一个 viewController(无论是哪个)作为“which2 ”。

【问题讨论】:

  • 你能贴出controllerClass吗
  • 无法添加它太长了,但我已经编辑了我的原始帖子并提供了更多信息。

标签: iphone uiviewcontroller uinavigationcontroller xcode5


【解决方案1】:

更新: 使用 Protools 更新值。

@protocol MissionProtocol
@required
-(void) updateValue:(NSSTring*) value;
@end

在您的 ViewControllers 中实现协议。即

@interface MissionViewController:UIViewController<MissionProtocol>
....
@end

在您的实现文件中,实现方法 updateValue。

-(void) updateValue:(NSString*) value
{
   self.which2=value;
}

然后把你原来的代码改成:

 NSString *viewController = @"gameViewController";

    NSString *missionViewController = [viewController stringByAppendingString:missionNo];
    Class controllerClass = NSClassFromString (missionViewController);
    id<MissionProtocol> detailViewController = [[controllerClass alloc] initWithNibName:@"gameViewController" bundle:nil];
    [detailViewController updateValue:which];

【讨论】:

  • 这只会在编译时产生影响......它不会修复错误。
  • @John 运行时的区别是“id”没有属性“which2”,而 SuperMissionViewController 有。为什么不能修复错误?
  • 实际上,OP 可能正在谈论编译时错误(有点难以阅读)。但针对您的评论,类型转换在运行时的效果为 0。
  • @John Spot on。 OP 必须在尝试访问“id”类型的对象上的“which2”var 时遇到编译时错误。转换为 SuperViewController 应该可以解决编译时错误。
  • 原始重播无法完成,因为正如更新帖子中所解释的,我不知道下一个 ViewController 的名称,因为它会有所不同。
【解决方案2】:

这样写:`detailViewController .which2 = which;

就在你推送导航控制器之前。`

【讨论】:

    【解决方案3】:

    只要项目中存在选择器,动态绑定允许您向id 发送消息,但不允许使用点语法。

    变化

    detailViewController.which2 = which;
    

    [detailViewController setWhich2:which];
    

    应该禁止警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多