我有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];
}
更新:已确认的连接
答案 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)
可能您没有连接插座。尝试将CTRL
从界面构建器中的UI控件拖动到视图控制器。
另一种可能的解决方案是选择控件,打开右侧面板的最后一个选项卡,然后在那里查找连接。
答案 3 :(得分:0)
您可能需要连接您的IBOutlets。当它们正确连接时,它们在源代码中应如下所示:对于每个连接的IBOutlet,应填写左侧的小灰点。
答案 4 :(得分:0)