无法设置任何IBOutlet

时间:2014-07-31 17:16:41

标签: ios xcode uiviewcontroller uikit iboutlet

我有UIViewController实例化另一个UIViewController(使用NIB)并将其推送到屏幕。然后,我尝试设置UILabel并获取UIWebView以加载网址。但它不起作用!没错!界面看起来就像在NIB中一样,没有编程方法可以将UILabel设置为不同的@"TestString"工作。

有人能指出我的问题吗?我似乎无法解决它。

谢谢。

实例化的UIViewController - WebView.h:

#import <UIKit/UIKit.h>

@interface WebView : UIViewController {

}

@property (strong, nonatomic) IBOutlet UILabel *testLabel;
@property (strong, nonatomic) IBOutlet UIWebView *webView;

- (void) openWeb: (NSString *) url;

@end

实例化UIViewController - WebView.m:

#import "WebView.h"

@interface WebView ()

@end

@implementation WebView

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        _testLabel = [[UILabel alloc] init];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void) setTestLabel:(UILabel *)theTestLabel {
    NSLog(@"Called set Label: %@", [theTestLabel text]);
    _testLabel = theTestLabel;
}

- (void) openWeb: (NSString *) url {
    NSLog(@"openWeb with url %@", url);
    [_testLabel setText:url];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[[NSURL alloc] initWithString:url]];
    [_webView loadRequest:urlRequest];
}

@end

实例化部分:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    ScheduledClass *c = [classes objectAtIndex:[indexPath row]];
    WebView *webView;
    webView = [[WebView alloc] initWithNibName:@"WebView" bundle:nil];
    UILabel *label = [[UILabel alloc] init];
    label.text = @"Testing";
    [webView setTestLabel:label];
    [webView openWeb:@"http://meirz.net"];

    [self.navigationController pushViewController:webView animated:YES];
}

更新:已确认的连接

enter image description here enter image description here enter image description here

5 个答案:

答案 0 :(得分:2)

奇怪的是,更多的人没有这个问题。

您无法在这些IBOutlet上设置属性的原因是这些UI对象尚未初始化。

您只是在此阶段初始化了ViewController。

所以你需要做的是创建一个将在你的标签中使用的字符串。

@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) NSString *stringForLabel;

在此设置:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    WebView *webView = [[WebView alloc] initWithNibName:@"WebView" bundle:nil];
    webView.stringForLabel = @"My Label String";    
    [self.navigationController pushViewController:webView animated:YES];

}

然后:

- (void)viewDidLoad {
   [super viewDidLoad];
   self.label.text = self.stringForLabel;
}

如果您使用带有segues的故事板,则同样适用:

- (void)buttonPress:(id)sender {
   [self performSegueWithIdentifier:@"mySegue" sender:self];
}

- (void)prepareForSegue(UIStoryboardSegue *)segue sender:(id)sender {
   AController *myController = [segue destinationViewController];
   myController.stringForLabel = @"My Label String";
}

答案 1 :(得分:1)

我尝试了所有现有的答案,并没有找到任何有用的东西。 现在我发现的是关注链接:New instance of a UIViewController within another UIViewController: Why can't I set an instance variable?

据我了解(如果我错了请纠正我 - 这对我很重要)我无法在视图实际加载之前设置任何出口值!!!

这意味着,如果您在

之前尝试将值设置为奥特莱斯

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

执行

后,[super viewDidLoad];将覆盖上述所有值,因此任何值都不会反​​映任何更改。

据我所知,需要做的是 - 定义不是Outlets的变量并为它们分配所需的值。在- (void) viewDidLoad { [super viewDidLoad]; }方法中,在超级之后,您将上面定义的值分配给受尊重的奥特莱斯。

请确认或更正我的答案!非常感谢你。

答案 2 :(得分:0)

  1. 可能您没有连接插座。尝试将CTRL从界面构建器中的UI控件拖动到视图控制器。

  2. 另一种可能的解决方案是选择控件,打开右侧面板的最后一个选项卡,然后在那里查找连接。

答案 3 :(得分:0)

您可能需要连接您的IBOutlets。当它们正确连接时,它们在源代码中应如下所示:对于每个连接的IBOutlet,应填写左侧的小灰点。

enter image description here

答案 4 :(得分:0)

检查这个和 这将对您有所帮助您需要在文件中设置 FileOwner ..

https://stackoverflow.com/a/12568803/563848

enter image description here enter image description here