【问题标题】:IOS/Objective-C: Change property in View Controller from shared instance?IOS/Objective-C:从共享实例更改视图控制器中的属性?
【发布时间】:2019-01-23 22:40:02
【问题描述】:

我的应用程序中的视图控制器通过共享实例访问的类从 Web 访问一些数据。此类执行各种服务器调用。

根据检索到的内容,我想更改视图控制器中的某些内容,该视图控制器具有连接到标签的插座属性。为此,在共享实例类中,我分配初始化与情节提要中的视图控制器关联的类,然后设置出口属性。但是,以下内容不会改变屏幕上的任何内容。

//通过共享实例访问的文件中的代码

    IDImportFacebookVC *vc= [[IDImportFacebookVC alloc] init];
        if (_contactCount==0) {
            NSString *emptyMessage = @"No friends found";
            vc.emptyMessage.text = emptyMessage;
        }

还有其他需要吗?另外,我认为这可能完全违反了 MVC,所以如果有任何建议可以更好地做到这一点,我将不胜感激。

提前感谢您的任何建议。

【问题讨论】:

  • 那是您的实际代码吗?您正在创建IDImportFacebookVC 的新实例。这与您希望更改属性的实例相同吗?
  • 是同一个VC。原始实例位于 Storyboard 中。毫无疑问,它很松散,似乎违反了 MVC,而且,它不起作用。我想我可以发出通知,但这听起来像是很多开销。必须有一个简单的方法来做到这一点。
  • 什么时候你有来自服务器的数据?最好在 viewdidload 中更新 iboutlets。我不知道你在哪里更新。

标签: ios objective-c storyboard


【解决方案1】:

您正在创建一个新的视图控制器,您没有访问正在显示在屏幕上的视图控制器。屏幕上的那个(如果它已经在屏幕上)已经有一个已初始化的实例。如果它还没有出现在屏幕上,操作系统将从情节提要中初始化一个,并且不会使用您刚刚初始化的那个。即使是这样,您初始化的那个也不会像您预期的那样做,因为它没有框架,也没有设置在窗口或导航控制器中。

在我看来,您的选择是按照您在评论中所说的那样发送通知,或者只是向您的共享实例添加一个属性,其中包含您要在屏幕上显示的数据。

如果您确定一旦屏幕显示此数据将可用,则属性方式有效,您可以根据共享实例的属性设置 UI 元素。如果您不确定数据何时可用,那么通知也可能是必要的。

【讨论】:

  • 我采用了属性方法,将它设置在共享实例中,然后在视图控制器的 viewwillappear 中抓取它。同时删除上面的代码。这解决了问题。
  • @user6631314 很好。我很高兴能帮上忙。感谢您的支持和接受的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多