【问题标题】:can't see properties of viewcontoller看不到视图控制器的属性
【发布时间】:2013-12-16 11:37:13
【问题描述】:

我想从不同的类更改默认视图控制器中标签的值。

  • 所以我开始了一个简单的“单一视图应用程序”iOS 项目 (Xcode5)
  • 这会自动为我生成一个 ViewController(我 理解是根视图控制器)
  • 我现在在我的视图中添加一个标签并将其连接到 ViewController(通过 IBOutlet 机制)
  • 我将此插座称为“gameStateLabel”,所以它在 ViewController.h 文件中看起来像这样

    @property (weak, nonatomic) IBOutlet UILabel *gameStateLabel;
    

接下来,我有一个完全独立的类,它包含我的代码逻辑,并且基于逻辑中的条件我想更改 UIlabel。

所以我尝试在我的其他班级这样做:

  • 像这样获取根视图控制器的实例:

    UIViewController * uvc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
    

我想我现在在 uvc 中有一个 rootviewcontroller 实例,应该能够访问并更改 gameStateLabel。

但是:我不能这样做 uvc.gameStateLabel 根本不会显示为属性,即使它被明确声明为属性并且我也为它添加了@synthesize。

任何帮助都将不胜感激 - 我已经为此发疯了。

(参考。我习惯在 Mac 端做类似的事情,我将标签声明为 AppDelegate 的属性,获取 Appdelegate 的实例并简单地引用标签属性并更改其文本]

这里是 ViewController。请注意,gameStateLable 是一个属性

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *gameStateLabel;

@end

@implementation ViewController
@synthesize gameStateLabel;
- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

这是我的类 cls1(继承自 NSObject)

#import "cls1.h"
#import "ViewController.h"


@implementation cls1

-(void) dummy{

UIViewController * uvc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];

// uvc does NOT show gameStateLabel in intellisense, i.e. uvc.gameStateLabel does NOT work

}

【问题讨论】:

  • 尝试委托函数。
  • 您是否尝试打印您通过[[[[UIApplication sharedApplication] delegate] window] rootViewController] 获得的rootViewController 对象?日志中的打印内容是什么?

标签: ios iphone objective-c cocoa


【解决方案1】:

在你的CustomClass.m文件中添加#import "mainRootVC.h"

并创建 ma​​inRootVC 的对象,例如,

mainRootVC *obj = [[mainRootVC alloc] init];
// Now you can access your label by
obj.gameStateLabel...

【讨论】:

  • 是的,我已经导入了。 #import "ViewController.h" 在我的情况下,但它没有帮助。我根本看不到视图控制器的任何声明属性
  • 检查您与文件所有者的连接是否正确???并尝试更改@property(强,非原子)而不是周。
【解决方案2】:

这样做...

YourViewController *rootController =[(YourViewController*)[(YourAppDelegate*)
        [[UIApplication sharedApplication]delegate] window] rootViewController];

【讨论】:

  • 是的,我已经尝试过了,但没有运气。我什至看不到视图控制器的属性——即使我创建了一个全新的实例
  • 刚刚在上面的主要问题中发布了代码。感谢所有 cmets 和帮助!
【解决方案3】:

也试试以下方法:

ViewController *controller = (ViewController*)self.window.rootViewController;

它将返回主故事板的初始视图控制器。

【讨论】:

    【解决方案4】:

    要从 viewController 向其他 viewController 发送信息:

    • 代表:Definiton and examples
    • NSNotificationCenter:Apple Documentation

      NSString *label = @"标签文本";

      [[NSNotificationCenter defaultCenter] postNotificationName:NAVIGATETO object:label userInfo:nil];

    您可以找到大量关于这两者的示例。我建议您使用其中之一。

    希望这会有所帮助。

    【讨论】:

      【解决方案5】:

      好的。我发现了两个问题。

      1. 我从我的 Mac 项目中复制了代码并对其进行了修改。似乎出了点问题。

      我重新输入了整个函数,它解决了大部分问题

      1. uvc 应该是 ViewController* 类型 - 而不是 UIViewController*,就像我在做的那样

      感谢大家的回复 - 非常感谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-28
        • 2012-04-02
        • 1970-01-01
        • 2017-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多