【问题标题】:Accessing Storyboard from Class in Objective-C从Objective-C中的类访问故事板
【发布时间】:2014-06-26 16:51:32
【问题描述】:

我在另一个文件中有一个 ViewController 类的对象,而不是在 VC.h/.m 中。 VC.h 连接到 Main.storyboard。我不确定如何从另一个文件中创建的 ViewController 对象更改情节提要标签的 label.text。

我被告知它与 Main.storyboard 的 nib 文件或这行代码有关:[UIStoryboard storyboardWithName:(NSString *)Main bundle:(NSBundle *)nil];我的故事板文件只是默认的Main.storyboard

我已经像这样初始化了 VC 对象的标签: self.myVCObject.label1 = [UILabel new] 并更改了值:self.myVCObject.label1.text = @"StackOverflow" ; 但运行应用程序时 IOS 模拟器中没有显示任何内容。问题是由于 VC 对象没有正确链接到情节提要吗?我将如何解决问题?

【问题讨论】:

  • 被动语态“我已被告知。”的有趣用法。这让我们对告密者的身份一无所知,这对他有利。

标签: ios iphone objective-c xcode uiviewcontroller


【解决方案1】:

您需要将故事板标签中的 IBOutlet 链接到 View Controller 类。然后就可以控制标签了。

【讨论】:

  • 我想我已经这样做了。在 VC.h 的界面中声明标签:@property (nonatomic, strong)IBOutlet UILabel *label1;
  • @user3780245 仅仅声明它是不够的,你必须把它连接起来。如果您从情节提要“右键单击”拖动到代码中,界面生成器将为您执行此操作。
  • 我已经使用 Control Drag 将它链接到 VC 文件。一切都正确链接。我的问题是,当我创建一个 ViewController 对象并尝试编辑标签的值时,它没有显示在模拟器中。在 MyOtherClass.h 我有一个 @property ViewController *VCObject 在 MyOtherClass.m 中:self.VCObject.label1 = [UILabel new] //label1 is a label of VCandself.VCObject.label1.text = @"StackOverflow" ; 但运行时模拟器中的文本不会改变。调试器显示 VCObject.label 已初始化。
  • 您不需要重新初始化标签self.VCObject.label1 = [UILabel new]。故事板中的所有视图都会自动实例化
  • 如果我不“重新”初始化标签,调试器会告诉我它被设置为 nil,所以我必须初始化标签。标签现在是 VCObject 的一部分,所以如果在 VC.h 中初始化,直到我将它作为 VCObject 的一部分进行初始化。
【解决方案2】:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myViewControllerWithLabel"];

vc.label1.text = @"Hello world";

【讨论】:

  • 这也行不通...我有 VC 文件,其中包含每个按钮的方法,但是有一个单独的类文件来进行计算和更改标签的值。如果一切都在 VC 类中,没有单独的类,那么一切正常,但是当我创建一个 VC 对象时,标签的文本没有任何反应,即使使用上面的方法。
  • 对于我的方案,我希望拆分上面的代码。 VC.h/.m 和vc.label1.text = @"Hello world"; 中的声明和初始化在另一个文件中。那么UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myViewControllerWithLabel"]; 应该在 VC.m 文件中吗?我认为应该。
  • 如果你已经在显示那个 VC,那么就不需要实例化一个新的 VC。 instantiateViewControllerWithIdentifier 正在创建该 VC 的新实例(例如 VC2),但如果您已经显示 VC1,并在 VC2 上进行更改,当然不会发生任何事情,因为 VS2 和 VS1 不一样!所以,如果你已经展示了 VC,那么在 - (void)viewDidLoad;该 VC 的方法。
  • 我想我必须这样做,但我想这样做,以便其他类创建一个 VC 对象并从那里更改标签,而不是从 VC,因此更改 VC1 中事物的值从 VC2 并在屏幕上显示。之前我真的不明白 View 创建了一个 VC 的对象。有没有办法访问该对象?它在哪里声明?谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多